packages feed

egison-tutorial 3.2.0 → 3.2.1

raw patch · 2 files changed

+58/−25 lines, 2 filesdep ~egison

Dependency ranges changed: egison

Files

Main.hs view
@@ -79,7 +79,7 @@  showBanner :: IO () showBanner = do-  putStrLn $ "Egison Tutorial for Version " ++ showVersion P.version ++ " (C) 2013 Satoshi Egi"+  putStrLn $ "Egison Tutorial for Version " ++ showVersion P.version ++ " (C) 2013-2014 Satoshi Egi"   putStrLn $ "http://www.egison.org"   putStrLn $ "Welcome to Egison Tutorial!" @@ -137,6 +137,9 @@     ('3':_) -> return 3     ('4':_) -> return 4     ('5':_) -> return 5+    ('6':_) -> return 6+    ('7':_) -> return 7+    ('8':_) -> return 8     _ -> do       putStrLn "Invalid input!"       readNumber m@@ -230,55 +233,85 @@ tutorial :: Tutorial tutorial =   Sections [-    ("Lv1 - Buildin data",+    ("Lv1 - Buildin data in Egison",       Contents [         ("There are two boolean value '#t' and '#f'.", ["#t", "#f"]),         ("You can do boolean operations with 'and', 'or', 'not'.", ["(and #t #f)", "(or #t #f)", "(not #t)"]),         ("You can do arithmetic operations with `+', '-', '*'.", ["(+ 1 2)", "(* 10 20)"]),-        ("We have predicates for numbers.", ["(eq-i? 1 1)", "(gt-i? 1 1)", "(lt-i? 1 1)",  "(gte-i? 1 1)", "(lte-i? 1 1)"]),+        ("You can write nested expression as follow.", ["(+ (* 10 20) 2)", "(/ (* 10 20) (+ 10 20))"]),+        ("We have predicates for numbers.", ["(eq? 1 1)", "(gt? 1 1)", "(lt? 1 1)",  "(gte? 1 1)", "(lte? 1 1)"]),         ("We are supporting rational numbers.", ["(+ 2/3 1/5)", "(/ 42 84)"]),         ("We are supporting floats, too.", ["(+ 10.2 1.3)", "(rtof 1/5)"]),-        ("We have predicates for floats.", ["(eq-f? 1.0 1.0)", "(gt-f? 1.0 1.0)", "(lt-i? 1.0 1.0)",  "(gte-i? 1.0 1.0)", "(lte-i? 1.0 1.0)"]),+        ("We have predicates for floats.", ["(eq? 1.0 1.0)", "(gt? 1.0 1.0)", "(lt? 1.0 1.0)",  "(gte? 1.0 1.0)", "(lte? 1.0 1.0)"]),         ("You can construct a tuple with '[]'.", ["[1 2]", "[1 2 3]"]),         ("A tuple which consists of only one elment is equal with that element itself.", ["[1]", "[[[1]]]"]),         ("You can construct a collection with '{}'.", ["{1}", "{1 2 3}"]),         ("The collection after '@' in a collection is called a subcollection.", ["{1 @{2 3}}", "{1 @{2 3} @{4 @{5}} 6}"]),+        ("You can destruct collections with 'car' and 'cdr'.", ["(car {1 2 3})", "(cdr {1 2 3})"]),         ("We can define an array as follow. We can access the element of the array using '_'.", ["(define $a [| 11 22 33 |])", "a_2"]),-        ("We can define an hash as follow. We can access the element of the hash using '_' as arrays.", ["(define $h {| [1 11] [2 22] [3 33] |})", "h_2"])+        ("We can define an hash as follow. We can access the element of the hash using '_' as arrays.", ["(define $h {| [1 11] [2 22] [3 33] |})", "h_2"]),+        ("There is a document that gather information of the specification of Egison at \"http://www.egison.org/manual/\".", [])         ]),-    ("Lv2 - Functional programming",+    ("Lv2 - Basics of functional programming",      Contents [+       ("With a 'take' function, you can extract a head part of the collection.", ["(take 0 {1 2 3 4 5})", "(take 3 {1 2 3 4 5})"]),+       ("'nats' is an infinite list that contains all natural numbers. Get a collection of natural numbers of any length you like.", ["(take 100 nats)"]),+       ("With a 'map' function, you can operate each element of the collection at onece.", ["(map (* $ 2) (take 100 nats))", "(take 100 (map (* $ 2) nats))", "(take 100 (map (quotient $ 2) nats))"]),+       ("You can create a \"partial\" function using '$' as an argument.", ["((+ $ 10) 1)"]),+       ("With a 'map2' function, you can combine two lists as follow.", ["(map2 + (take 100 nats) (take 100 nats))", "(take 100 (map2 * nats nats))"]),+       ("With a 'foldl' function, you can gather together all elements of the collection using an operator you like.\nWould you try to get a sum of from 1 to 100?", ["(foldl + 0 {1 2 3 4 5})", "(foldl * 1 {1 2 3 4 5})"]),+       ("Try to create a sequce of number '{1 1/2 1/3 1/4 ... 1/100}'.", []),+       ("Try to calculate '1 + 1/2 + 1/3 + 1/4 + ... + 1/100'.", []),+       ("Try to calculate '1 + (1/2)^2 + (1/3)^2 + (1/4)^2 + ... + (1/100)^2'.", []),+       ("You can view all library functions on collection at \"http://www.egison.org/libraries/core/collection.html\".", [])+       ]),+    ("Lv3 - Define your own functions",+     Contents [        ("You can bind a value to a variable with a 'define' expression.\nYou can easily get the value you binded to the variable.", ["(define $x 10)", "x"]),        ("You can define a function. Let's define a function and test it.", ["(define $f (lambda [$x] (+ x 1)))", "(f 10)", "(define $g (lambda [$x $y] (* x y)))", "(g 10 20)"]),+       ("You can write a recursive definition. Let's try that.", ["(define $odds {1 @(map (+ $ 2) odds)})", "(take 10 odds)"]),+       ("Try to define 'evens' referring to 'odds' example above.", []),        ("You can define local variables with a 'let' expression.", ["(let {[$x 10] [$y 20]} (+ x y))"]),-       ("Let's try 'if' expressions.", ["(if #t 1 2)", "(let {[$x 10]} (if (eq? x 10) 1 2))"])+       ("Let's try 'if' expressions.", ["(if #t 1 2)", "(let {[$x 10]} (if (eq? x 10) 1 2))"]),+       ("Using 'define' and 'if', you can write recursive functions as follow.", ["(define $your-take (lambda [$n $xs] (if (eq? n 0) {} {(car xs) @(your-take (- n 1) (cdr xs))})))", "(your-take 10 nats)"]),+       ("Try to write a 'your-map' function.", []),+       ("You can view all library functions on collection at \"http://www.egison.org/libraries/core/collection.html\".", [])        ]),-    ("Lv3 - Pattern-matching",+    ("Lv4 - Basic of pattern-matching",      Contents [        ("You can do pattern-matching against multisets.", ["(match-all {1 2 3} (multiset integer) [<cons $x $xs> [x xs]])"]),-       ("You can do non-linear pattern-matching. Try the following expression with various targets.", ["(match-all {1 2 1 3} (multiset integer) [<cons $x <cons ,x _>> x])"]),+       ("You can do non-linear pattern-matching.\nTry the following expression with various targets.", ["(match-all {1 2 1 3} (multiset integer) [<cons $x <cons ,x _>> x])"]),        ("You can change the way of pattern-matching by changing \"matcher\".\nTry the following expressions.", ["(match-all {1 2 3} (list integer) [<cons $x $xs> [x xs]])", "(match-all {1 2 3} (multiset integer) [<cons $x $xs> [x xs]])", "(match-all {1 2 3} (set integer) [<cons $x $xs> [x xs]])"]),-       ("'list' has a special pattern-constructor 'join'.\n'join' divides a collection into two collections.\nTry the following expressions.", ["(match-all {1 2 3 4 5} (list integer) [<join $xs $ys> [xs ys]])", "(match-all {1 2 3 4 5} (list integer) [<join _ <cons $x <join _ <cons $y _>>>> [x y]])"]),-       ("We can do pattern-matching against a collection of collections as follow.", ["(match-all {{1 2 3 4 5} {4 5 1} {6 1 7 4}} (list (multiset integer)) [<cons <cons $n _> <cons <cons ,n _> <cons <cons ,n _> <nil>>>> n])"]),+       ("We can do pattern-matching against a collection of collections as follow.", ["(match-all {{1 2 3 4 5} {4 5 1} {6 1 7 4}} (list (multiset integer)) [<cons <cons $n _> <cons <cons ,n _> <cons <cons ,n _> _>>> n])"]),        ("A pattern that has '^' ahead of which is called a not-pattern.\nA not-pattern matches when the target does not match against the pattern.", ["(match-all {1 2 1 3} (multiset integer) [<cons $x ^<cons ,x _>> x])"]),        ("An and-pattern matches when the all patterns matches the target.\nIt can be used like an as-pattern.", ["(match-all {1 2 1 3} (multiset integer) [<cons $x (& ^<cons ,x _> $xs)> [x xs]])"]),-       ("An or-pattern matches when one of the patterns matches the target.", ["(match-all {1 2 1 3} (multiset integer) [<cons $x (| <cons ,x _> ^<cons ,x _>)> x])"])+       ("An or-pattern matches when one of the patterns matches the target.", ["(match-all {1 2 1 3} (multiset integer) [<cons $x (| <cons ,x _> ^<cons ,x _>)> x])"]),+       ("'list' has a special pattern-constructor 'join'.\n'join' divides a collection into two collections.\nTry the following expressions.", ["(match-all {1 2 3 4 5} (list integer) [<join $xs $ys> [xs ys]])"]),+       ("You can enumerate two combination of numbers as follow.\nTry to enumerate three combination of numbers.", ["(match-all {1 2 3 4 5} (list integer) [<join _ <cons $x <join _ <cons $y _>>>> [x y]])"]),+       ("Did you think how about \"n\" comination of the elements of the collection?\nWe already have a solution.\nWe can write a pattern that include '...' as the following demonstrations.", ["(match-all {1 2 3 4 5} (list integer) [(loop $i [1 ,4] <join _ <cons $a_i ...>> _) a])", "(match-all {1 2 3 4 5} (list integer) [(loop $i [1 ,5] <join _ <cons $a_i ...>> _) a])", "(match-all {1 2 3 4 5} (list integer) [(loop $i [1 $n] <join _ <cons $a_i ...>> _) [n a]])"]),+       ("You can view a lot of demonstration of pattern-matching at \"http://www.egison.org/demonstrations/\".", [])        ]),-    ("Lv4 - Infinite collections (Play with prime numbers)",+    ("Lv5 - Pattern-matching against infinite collections",      Contents [-       ("First load a library for prime numers.", ["(load \"lib/math/prime.egi\")"]),-       ("Get elements from the sequence of prime numebers using 'take' function.", ["(take 10 primes)"]),+       ("We can write a pattern-matching against infinite lists even if that has infinite results.", ["(take 10 (match-all nats (multiset integer) [<cons $m _> m]))", "(take 10 (match-all nats (multiset integer) [<cons $m <cons $n _>> [m n]]))"]),+       ("We can enumerate all two combinations of natural numbers as follow.", ["(define $two-combs (match-all nats (list integer) [<join _ (& <cons $x _> <join _ <cons $y _>>)> [x y]]))", "(take 100 two-combs)"]),+       ("We can enumerate all pythagoras numbers as follow.", ["(define $pyths (map (lambda [$x $y] (+ (* x x) (* y y))) two-combs))", "(take 100 pyths)"]),+       ("We have an infinite list of prime numers in 'primes'.\nPlease check it with a 'take' function.", ["(take 10 primes)"]),        ("We can get twin primes or triplet primes using pattern-matching as follow.", ["(take 10 (match-all primes (list integer) [<join _ <cons $n <cons ,(+ n 2) _>>> [n (+ n 2)]]))", "(take 10 (match-all primes (list integer) [<join _ <cons $n <cons ,(+ n 2) <cons ,(+ n 6) _>>>> [n (+ n 2) (+ n 6)]]))", "(take 10 (match-all primes (list integer) [<join _ <cons $n <cons ,(+ n 4) <cons ,(+ n 6) _>>>> [n (+ n 2) (+ n 6)]]))"]),-       ("With predicate-patterns and and-patterns, we can do interesting things as follow.", ["(take 1 (match-all primes (list integer) [<join _ <cons $n <cons (& ?(gt-i? $ (+ 10 n)) $m) _>>> [n m]]))", "(take 1 (match-all primes (list integer) [<join _ <cons $n <cons (& ?(gt-i? $ (+ 20 n)) $m) _>>> [n m]]))"]),-       ("Play freely with the sequence of prime numbers.", [])+       ("We can enumurate all common elements between 'primes' and 'pyths' as follow.\nCan you find a pattern in these numbers.", ["(match-all [(take 100 pyths) (take 100 primes)] [(list integer) (list integer)] [[<join _ <cons $c _>> <join _ <cons ,c _>>] c])"]),+       ("Play freely with the sequences of natural numbers.\nYou can view a lot of demonstration of pattern-matching at \"http://www.egison.org/demonstrations/\".", [])        ]),-    ("Lv5 - Loop-patterns",+    ("Lv6 (preparing) - Pattern-matching against graphs",      Contents [-       ("We can write a pattern that include '...'. The following are demonstrations.", ["(match-all {1 2 3 4 5} (list integer) [(loop $i [1 ,2] <cons $a_i ...> _) a])", "(match-all {1 2 3 4 5} (list integer) [(loop $i [1 ,3] <cons $a_i ...> _) a])", "(match-all {1 2 3 4 5} (list integer) [(loop $i [1 ,2] <join _ <cons $a_i ...>> _) a])", "(match-all {1 2 3 4 5} (list integer) [(loop $i [1 ,3] <join _ <cons $a_i ...>> _) a])"])+       ("Sorry, we are preparing this section now.", [])+       ]),+    ("Lv7 (preparing) - Modularize patterns",+     Contents [+       ("Sorry, we are preparing this section now.", [])+       ]),+    ("Lv8 (preparing) - Define your own matchers",+     Contents [+       ("Sorry, we are preparing this section now.", [])        ])---    ("Lv6 (preparing) - Matcher definition (Play with graphs)",---     Contents [---       ("Sorry, we are creating this section now.", [])---       ])   ] 
egison-tutorial.cabal view
@@ -1,5 +1,5 @@ Name:                egison-tutorial-Version:             3.2.0+Version:             3.2.1 Synopsis:            A Tutorial Program for The Programming Language Egison Description:         A tutorial program for the programming language Egison. Homepage:            http://www.egison.org@@ -17,4 +17,4 @@  Executable egison-tutorial   Main-is:             Main.hs-  Build-depends:       egison >= 3.2.6, base >= 4.0 && < 5, array, containers, unordered-containers, haskeline, transformers, mtl, parsec >= 3.0, directory, ghc, ghc-paths, filepath, regex-posix, strict-io, bytestring+  Build-depends:       egison >= 3.2.8, base >= 4.0 && < 5, array, containers, unordered-containers, haskeline, transformers, mtl, parsec >= 3.0, directory, ghc, ghc-paths, filepath, regex-posix, strict-io, bytestring