Category:Egison: Difference between revisions

no edit summary
No edit summary
 
(5 intermediate revisions by 3 users not shown)
Line 2:
|strength=strong
|safety=safe
|compat=structural
|checking=dynamic
|gc=yes
|LCT=yes
|site=http://www.egison.org}}{{codepad}}
{{language programming paradigm|Pattern-matching oriented}}
{{language programming paradigm|functional}}
{{implementation|Lisp}}
'''Egison''' is the programming langugage that realized non-linear pattern-matching against unfree data types. With Egison, we can represent pattern-matching with unfree data types intuitively.
 
For example, we can represent pattern-matching against lists, multisets, sets, trees, and graphs.
'''Egison''' is a programming language that realizes non-linear pattern-matching against unfree data types.
We can directly represent pattern-matching against a wide range of data types such as lists, multisets, sets, trees and graphs.
Egison makes programming dramatically simple!
 
= Pattern Matching Oriented =
 
Egison proposes a new paradigm pattern-matching-oriented. The combination of all of the following features enables intuitive powerful pattern-matching.
 
* Non-linear patterns
* Pattern-matching with multiple results
* Modularization of the way of pattern-matching
* Pattern-matching with lexical scoping
 
= Poker Hands Demonstration =
 
<lang egison>
;;;
;;;
;;; Poker-hands demonstration
;;;
;;;
 
;;
;; Matcher definitions
;;
(define $suit
(algebraic-data-matcher
{<spade> <heart> <club> <diamond>}))
 
(define $card
(algebraic-data-matcher
{<card suit (mod 13)>}))
 
;;
;; A function that determins poker-hands
;;
(define $poker-hands
(lambda [$cs]
(match cs (multiset card)
{[<cons <card $s $n>
<cons <card ,s ,(- n 1)>
<cons <card ,s ,(- n 2)>
<cons <card ,s ,(- n 3)>
<cons <card ,s ,(- n 4)>
<nil>>>>>>
<Straight-Flush>]
[<cons <card _ $n>
<cons <card _ ,n>
<cons <card _ ,n>
<cons <card _ ,n>
<cons _
<nil>>>>>>
<Four-of-Kind>]
[<cons <card _ $m>
<cons <card _ ,m>
<cons <card _ ,m>
<cons <card _ $n>
<cons <card _ ,n>
<nil>>>>>>
<Full-House>]
[<cons <card $s _>
<cons <card ,s _>
<cons <card ,s _>
<cons <card ,s _>
<cons <card ,s _>
<nil>>>>>>
<Flush>]
[<cons <card _ $n>
<cons <card _ ,(- n 1)>
<cons <card _ ,(- n 2)>
<cons <card _ ,(- n 3)>
<cons <card _ ,(- n 4)>
<nil>>>>>>
<Straight>]
[<cons <card _ $n>
<cons <card _ ,n>
<cons <card _ ,n>
<cons _
<cons _
<nil>>>>>>
<Three-of-Kind>]
[<cons <card _ $m>
<cons <card _ ,m>
<cons <card _ $n>
<cons <card _ ,n>
<cons _
<nil>>>>>>
<Two-Pair>]
[<cons <card _ $n>
<cons <card _ ,n>
<cons _
<cons _
<cons _
<nil>>>>>>
<One-Pair>]
[<cons _
<cons _
<cons _
<cons _
<cons _
<nil>>>>>>
<Nothing>]})))
 
;;
;; Demonstration code
;;
(poker-hands {<Card <Club> 12>
<Card <Club> 10>
<Card <Club> 13>
<Card <Club> 1>
<Card <Club> 11>});=><Straight-Flush>
 
(poker-hands {<Card <Diamond> 1>
<Card <Club> 2>
<Card <Club> 1>
<Card <Heart> 1>
<Card <Diamond> 2>});=><Full-House>
 
(poker-hands {<Card <Diamond> 4>
<Card <Club> 2>
<Card <Club> 5>
<Card <Heart> 1>
<Card <Diamond> 3>});=><Straight>
 
(poker-hands {<Card <Diamond> 4>
<Card <Club> 10>
<Card <Club> 5>
<Card <Heart> 1>
<Card <Diamond> 3>});=><Nothing>
</lang>
Anonymous user