Ruby Egison

Preview:

DESCRIPTION

This slide is presented at RubyKaigi 2014 on Sep 18. We have designed and implemented the library that realizes non-linear pattern matching against unfree data types. We can directly express pattern-matching against lists, multisets, and sets using this library. The library is already released via RubyGems.org as one of gems. The expressive power of this gem derives from the theory behind the Egison programming language and is so strong that we can write poker-hands analyzer in a single pattern matching expression. This is impossible even in any other state-of-the-art programming language. Pattern matching is one of the most important features of programming language for intuitive representation of algorithms. Our library simplifies code by replacing not only complex conditional branches but also nested loops with an intuitive pattern-matching expression.

Citation preview

Egison Pattern Matching in Ruby - Express Intuition Directly with Essentially New Syntax - Vol.01 Sep/18/2014 Satoshi Egi Rakuten Institute of Technology http://rit.rakuten.co.jp/

2

Self-Introduction

Name Satoshi Egi (江木 聡志)

Association Rakuten Institute of Technology (楽天技術研究所)

Education Majored Computer Science in the University of Tokyo

Interests Programming Languages, AI (Mathematics)

Website http://www.egison.org/~egi/

3

Very Quick Introduction of Today’s Contents

I have created the programming language that realized non-linear pattern-matching even against data that have no standard form.

(match-all xs (multiset integer) ! [<cons $x <cons ,x _>> x]) !Egison

Enumerate the elements of the collection ‘xs’ that appear

more than twice

pairs = [] !(1..n).each do |i| ! (i..n).each do |j| ! if xs[i] == xs[j] ! pairs = pairs + ! xs[i] ! end ! end !end !

Ruby

Non-linear patterns allow multiple occurrences of same variables in a pattern

4

Very Quick Introduction of Today’s Contents

I have implemented the same feature in Ruby! The source code on GitHub!

match_all(xs) do ! with(Multiset.(_x,__x, *_)) { x } !end !Ruby with Egison gem

Enumerate the elements of the collection ‘xs’ that appear

more than twice

pairs = [] !(1..n).each do |i| ! (i..n).each do |j| ! if xs[i] == xs[j] ! pairs = pairs + ! xs[i] ! end ! end !end !

Ruby

https://github.com/egison/egison-ruby

5

Very Quick Introduction of Today’s Contents

Poker hands analyzer with a single expression in Ruby!

Our pattern-matching expression represents all hands in a single pattern

6

Very Quick Introduction of Today’s Contents

We can also pattern-match against infinite streams.

… , x, x + 2, …

7

Source and English Document are on GitHub https://github.com/egison/egison-ruby

8

Please Check My Blog Article, too

9

We wrote also Japanese Documents on Qiita

1,0004 views, 185 Hatena Bookmarks!

10

1. Introduction - What is Pattern Matching? 2. Egison Pattern Matching in Ruby 3. Let’s Try Egison Gem 4. Future Goal – Application of Egison

Table of Contents

11

1. Introduction - What is Pattern Matching? 2. Egison Pattern Matching in Ruby 3. Let’s Try Egison Gem 4. Future Goal – Application of Egison

Table of Contents

12

What is Pattern Matching?

A feature of programming languages that simplifies programs.

• Data Decomposition • Pattern-matching enables us to extract and

examine the value of an instance variable very easily

• Conditional Branches • Pattern-matching eliminates nested and

complex conditional branches

13

Greeting Demonstration

14

Greeting Demonstration

15

Greeting Demonstration

16

Greeting Demonstration

fail

17

Greeting Demonstration

success

18

Greeting Demonstration

19

Flow of Pattern Matching

fail

20

Flow of Pattern Matching

success

21

Greeting Demonstration

22

Flow of Pattern Matching

fail

23

Flow of Pattern Matching

fail

24

Flow of Pattern Matching

fail

25

Flow of Pattern Matching

fail

26

Flow of Pattern Matching

success

27

Greeting Demonstration

28

1. Introduction - What is Pattern Matching? 2. Egison Pattern Matching in Ruby 3. Let’s Try Egison Gem 4. Future Goal – Application of Egison

Table of Contents

29

The Features of Egison Pattern-Matching in Ruby

We have features in addition to simplification of data decomposition and conditional branches

• Customizable Way of Pattern-Matching • We can do pattern-matching against not only

fixed data such as lists but also multisets and sets that have multiple ways of decomposition

• Non-Linear Pattern-Matching • We allow multiple occurrences of same

variables in patterns • Pattern-Matching with Backtracking

• We allow multiple results of pattern-matching even infinite results

30

Customizable Pattern Matching For Various Data

We can define how to pattern-match for each data types

31

Pattern Matching with Multiple Results

We can handle multiple results of pattern-matching

32

Element Patterns and Collection Patterns

A literal that starts with ‘_’ is a pattern-variable. We can refer the result of pattern-matching through them.

33

Element Patterns and Collection Patterns

A subcollection pattern matches the subcollection of the target array. A subcollection pattern starts with ‘*’.

34

Element Patterns and Collection Patterns

A literal that starts with ‘_’ is a pattern-variable. We can refer the result of pattern-matching through them.

35

Element Patterns and Collection Patterns

A subcollection pattern matches the subcollection of the target array. A subcollection pattern starts with ‘*’.

36

Combinations with Pattern Matching

… , x, …, y, …

… , x, …, y, …, z, …

37

Non-Linear Pattern Matching

A Pattern whose form is ‘__("...")’ is a value pattern

38

Non-Linear Pattern Matching

A Pattern whose form is ‘__("...")’ is a value pattern

We can omit (“ and “) when enclosed with them is a single variable

39

Poker Hands Analyzer in Ruby

40

The Pattern for Straight Flash

Pattern for straight flash

41

The Pattern for Straight Flash

Pattern for straight flash

42

Poker Hands Analyzer in Ruby

Same suit with $s

43

Poker Hands Analyzer in Ruby

Same suit with $s

We can write any expression after ‘__’

Numbers are serial from $n

44

Poker Hands Analyzer in Ruby

Pattern for two pairs

45

The Pattern for Two Pairs

Pattern for two pairs

46

The Pattern for Two Pairs

Pattern for two pairs

Same number with $m

Same number with $n

47

The Pattern for Two Pairs

Pattern for two pairs

Same number with $m

Same number with $n

Non-linear patterns have very strong power

48

Poker Hands Analyzer in Ruby

Non-linear patterns enables to represent all hands in a single pattern

49

We can also pattern-match against infinite streams.

… , x, x + 2, …

Pattern Matching against Streams with Infinite Results

50

One More Interesting Demonstration

We can also enumerate prime triplets using and-patterns and or-patterns effectively.

51

1. Introduction - What is Pattern Matching? 2. Egison Pattern Matching in Ruby 3. Let’s Try Egison Gem 4. Future Goal – Application of Egison

Table of Contents

52

Egison Gem is on GitHub https://github.com/egison/egison-ruby

53

Try Egison Gem!

$ git clone https://github.com/egison/egison-ruby.git$ cd egison-ruby/$ bundle install$ make$ ls sample/… sample/poker_hands.rb …$ ruby sample/poker_hands.rb…

Egison Gem is written in pure Ruby. Installation is very easy via RubyGems.

We have prepared a lot of samples. Please try all of them.

54

1. Introduction - What is Pattern Matching? 2. Egison Pattern Matching in Ruby 3. Let’s Try Egison Gem 4. Future Goal – Application of Egison

Table of Contents

55

Introduction of the Egison Programming Language

56

Profile of Egison

Paradigm Pattern-matching-oriented, Purely functional

Author Satoshi Egi

License MIT

Version 3.3.12 (2014/9/18)

First Released 2011/5/24

Filename Extension .egi

Implemented in Haskell (about 3,500 lines)

I have created Egison to represent human’s intuition directly.

57

The Additional Features of Pure Egison

We have features in additon to simplification of data decomposition and conditional branches

• Ways of Pattern-Matching is More Customizable • We can customize the way of pattern-

matching against not only against collection such as lists, multisets and sets

• Pattern Modularization with Lexical Scoping • We allow multiple occurrences of same

variables in patterns

58

More complex example, Mahjong

59

More complex example, Mahjong

Two same tiles

Three consecutive tiles

Three same tiles

60

More complex example, Mahjong

Two same tiles

Three consecutive tiles

Three same tiles

Seven twins or one twin + four shuntsu or kohtsu

61

More complex example, Mahjong

Two same tiles

Three consecutive tiles

Three same tiles

Seven twins or one twin + four shuntsu or kohtsu

Pattern modularization makes programming more simple!

62

Egison on an online media

63

Egison on Hacker News

Egison was actively discussed on Hacker News twice!

64

Total session is 14,109

Access Map of the Website in This Half Year (2014/1/14 – 2014/7/14)

65

Egison will be taught in the University of Tokyo by Prof. Hagiya

Egison will have big impact on the academic world, too!

66

Growth of Community in This Year (2013/11/15 – 2014/9/18)

•  Mailing List Members •  Before: 12 – Only my friends •  Current: 23 – Communicating in English

•  Stargazers on GitHub •  Before: 12 – Only my friends •  Current: 214 – People from all over the world!

67

My Mind Map on Programming Language

68

My Mind Map on Programming Language

69

My Mind Map on Programming Language

Egison is pioneering this field!

70

Application of Egison

71

There is a Wide Range of Application

•  Daily programming •  Able to express complex tasks simply

•  Data access and analysis •  Work as the most elegant query language •  Able to access the wide range of data types in a

unified way •  Natural language processing

•  Able to handle complex structures intuitively as humans do in their mind

•  AI (Mathematical expression handling) •  Able to handle various mathematical and abstract

notions directly

72

Query example

•  Query that returns twitter users who are followed by “__Egi” but not follow back “__Egi”.

id integer name string

User:

from_id integer to_id Integer

Follow:

73

SQL version

•  Complex and difficult to understand •  Complex where clause contains “NOT EXIST” •  Subquery

74

Egison version

•  Very Simple •  No where clauses •  No subquery

75

Egison version

•  Very Simple •  No where clauses •  No subquery

Joining 4 tables

1. Get id of “__Egi” 2. Followed by ‘uid’ 3. But not follow back not 4. Get name of ‘fid’ Return the results

76

My Dream

•  Daily programming •  Able to express complex tasks simply

•  Data access and analysis •  Work as the most elegant query language •  Able to access the wide range of data types in a

unified way •  Natural language processing

•  Able to handle complex structures intuitively as humans do in their mind

•  AI (Mathematical expression handling) •  Able to handle various mathematical and abstract

notions directly

•  Programs that find interesting things •  Programs that build math theories •  Programs that generate programs

77

[ANN]Articles on Egison will be on CodeIQ MAGAZINE

78

[ANN] We will post Egison problems on CodeIQ

79

Thank you!

Please try Egison and give us feedback!

satoshi.egi@mail.rakuten.com

80

Problem

What is the 40th pair of prime numbers of the form (p, p+8)?

Please try and answer to @Egison_Lang!

e.g. [3, 11] [5, 13] [11, 19]…

Recommended