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.
Egison Pattern Matching in Ruby - Express Intuition Directly with Essentially New Syntax
1. 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. 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. 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.
Non-linear patterns allow multiple occurrences of same variables
in a pattern
Enumerate the elements of
the collection ‘xs’ that appear
more than twice
(match-all xs (multiset integer)!
[<cons $x <cons ,x _>> x])!
Egison
pairs = []!
(1..n).each do |i|!
(i..n).each do |j|!
if xs[i] == xs[j]!
pairs = pairs +!
xs[i]!
end!
end!
end!
Ruby
4. 4
Very Quick Introduction of Today’s Contents
I have implemented the same feature in Ruby!
The source code on GitHub!
https://github.com/egison/egison-ruby
Enumerate the elements of
the collection ‘xs’ that appear
more than twice
match_all(xs) do!
with(Multiset.(_x,__x, *_)) { x }!
end!
Ruby with Egison gem
pairs = []!
(1..n).each do |i|!
(i..n).each do |j|!
if xs[i] == xs[j]!
pairs = pairs +!
xs[i]!
end!
end!
end!
Ruby
5. 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. 6
Very Quick Introduction of Today’s Contents
We can also pattern-match against infinite streams.
… , x, x + 2, …
7. 7
Source and English Document are on GitHub
https://github.com/egison/egison-ruby
9. 9
We wrote also Japanese Documents on Qiita
1,0004 views, 185 Hatena Bookmarks!
10. 10
Table of Contents
1. Introduction - What is Pattern Matching?
2. Egison Pattern Matching in Ruby
3. Let’s Try Egison Gem
4. Future Goal – Application of Egison
11. 11
Table of Contents
1. Introduction - What is Pattern Matching?
2. Egison Pattern Matching in Ruby
3. Let’s Try Egison Gem
4. Future Goal – Application of Egison
12. 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
28. 28
Table of Contents
1. Introduction - What is Pattern Matching?
2. Egison Pattern Matching in Ruby
3. Let’s Try Egison Gem
4. Future Goal – Application of Egison
29. 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. 30
Customizable Pattern Matching For Various Data
We can define how to pattern-match for each data
types
31. 31
Pattern Matching with Multiple Results
We can handle multiple results of pattern-matching
32. 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. 33
Element Patterns and Collection Patterns
A subcollection pattern matches the subcollection
of the target array. A subcollection pattern starts
with ‘*’.
34. 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. 35
Element Patterns and Collection Patterns
A subcollection pattern matches the subcollection
of the target array. A subcollection pattern starts
with ‘*’.
37. 37
Non-Linear Pattern Matching
A Pattern whose form is ‘__("...")’ is a value pattern
38. 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
46. 46
The Pattern for Two Pairs
Pattern for two pairs
Same number with $m
Same number with $n
47. 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. 48
Poker Hands Analyzer in Ruby
Non-linear patterns enables to
represent all hands in a single pattern
49. Pattern Matching against Streams with Infinite Results
We can also pattern-match against infinite streams.
49
… , x, x + 2, …
50. 50
One More Interesting Demonstration
We can also enumerate prime triplets using and-patterns
and or-patterns effectively.
51. 51
Table of Contents
1. Introduction - What is Pattern Matching?
2. Egison Pattern Matching in Ruby
3. Let’s Try Egison Gem
4. Future Goal – Application of Egison
52. 52
Egison Gem is on GitHub
https://github.com/egison/egison-ruby
53. 53
Try Egison Gem!
Egison Gem is written in pure Ruby.
Installation is very easy via RubyGems.
$ 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
…
We have prepared a lot of samples.
Please try all of them.
54. 54
Table of Contents
1. Introduction - What is Pattern Matching?
2. Egison Pattern Matching in Ruby
3. Let’s Try Egison Gem
4. Future Goal – Application of Egison
56. 56
Profile of Egison
I have created Egison to represent human’s intuition
directly.
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)
57. 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
59. 59
More complex example, Mahjong
Two same tiles
Three consecutive tiles
Three same tiles
60. 60
More complex example, Mahjong
Two same tiles
Three consecutive tiles
Three same tiles
Seven twins or one twin + four shuntsu or kohtsu
61. 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!
63. 63
Egison on Hacker News
Egison was actively discussed
on Hacker News twice!
64. 64
Access Map of the Website in This Half Year
(2014/1/14 – 2014/7/14)
Total session is 14,109
65. 65
Egison will be taught in the University of Tokyo by
Prof. Hagiya
Egison will have big impact on
the academic world, too!
66. 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!
71. 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. 72
Query example
• Query that returns twitter users who are
followed by “__Egi” but not follow back
“__Egi”.
User:
id integer
name string
Follow:
from_id integer
to_id Integer
73. 73
SQL version
• Complex and difficult to understand
• Complex where clause contains “NOT EXIST”
• Subquery
75. 75
Egison version
• Very Simple
• No where clauses
• No subquery
Joining 4 tables
1. Get id of “__Egi”
2. Followed by ‘uid’
not 3. But not follow back
4. Get name of ‘fid’
Return the results
76. 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
• Programs that find interesting things
• Programs that build math theories
• Programs that generate programs
• 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