shen-ruby 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +9 -3
  4. data/Gemfile +1 -4
  5. data/HISTORY.md +16 -0
  6. data/MIT_LICENSE.txt +1 -1
  7. data/README.md +25 -26
  8. data/Rakefile +3 -11
  9. data/bin/shen_test_suite.rb +15 -3
  10. data/bin/srrepl +6 -8
  11. data/lib/shen_ruby.rb +6 -1
  12. data/lib/shen_ruby/converters.rb +23 -0
  13. data/lib/shen_ruby/version.rb +1 -1
  14. data/shen-ruby.gemspec +4 -1
  15. data/shen/lib/shen_ruby/shen.rb +49 -33
  16. data/shen/release/benchmarks/N_queens.shen +45 -45
  17. data/shen/release/benchmarks/README.shen +14 -14
  18. data/shen/release/benchmarks/benchmarks.shen +52 -52
  19. data/shen/release/benchmarks/einstein.shen +32 -32
  20. data/shen/release/benchmarks/interpreter.shen +219 -219
  21. data/shen/release/benchmarks/jnk.shen +193 -193
  22. data/shen/release/benchmarks/powerset.shen +10 -10
  23. data/shen/release/benchmarks/prime.shen +10 -10
  24. data/shen/release/benchmarks/short.shen +129 -129
  25. data/shen/release/k_lambda/core.kl +181 -181
  26. data/shen/release/k_lambda/declarations.kl +131 -131
  27. data/shen/release/k_lambda/load.kl +84 -84
  28. data/shen/release/k_lambda/macros.kl +112 -112
  29. data/shen/release/k_lambda/prolog.kl +252 -252
  30. data/shen/release/k_lambda/reader.kl +222 -222
  31. data/shen/release/k_lambda/sequent.kl +166 -166
  32. data/shen/release/k_lambda/sys.kl +271 -271
  33. data/shen/release/k_lambda/t-star.kl +139 -139
  34. data/shen/release/k_lambda/toplevel.kl +135 -135
  35. data/shen/release/k_lambda/track.kl +103 -103
  36. data/shen/release/k_lambda/types.kl +324 -324
  37. data/shen/release/k_lambda/writer.kl +105 -105
  38. data/shen/release/k_lambda/yacc.kl +113 -113
  39. data/shen/release/test_programs/Chap13/problems.txt +26 -26
  40. data/shen/release/test_programs/README.shen +52 -52
  41. data/shen/release/test_programs/TinyLispFunctions.txt +15 -15
  42. data/shen/release/test_programs/TinyTypes.shen +55 -55
  43. data/shen/release/test_programs/binary.shen +24 -24
  44. data/shen/release/test_programs/bubble_version_1.shen +28 -28
  45. data/shen/release/test_programs/bubble_version_2.shen +22 -22
  46. data/shen/release/test_programs/calculator.shen +21 -21
  47. data/shen/release/test_programs/cartprod.shen +23 -23
  48. data/shen/release/test_programs/change.shen +25 -25
  49. data/shen/release/test_programs/classes-defaults.shen +94 -94
  50. data/shen/release/test_programs/classes-inheritance.shen +100 -100
  51. data/shen/release/test_programs/classes-typed.shen +74 -74
  52. data/shen/release/test_programs/classes-untyped.shen +46 -46
  53. data/shen/release/test_programs/depth_.shen +14 -14
  54. data/shen/release/test_programs/einstein.shen +34 -34
  55. data/shen/release/test_programs/fruit_machine.shen +46 -46
  56. data/shen/release/test_programs/interpreter.shen +217 -217
  57. data/shen/release/test_programs/metaprog.shen +85 -85
  58. data/shen/release/test_programs/minim.shen +192 -192
  59. data/shen/release/test_programs/mutual.shen +11 -11
  60. data/shen/release/test_programs/n_queens.shen +45 -45
  61. data/shen/release/test_programs/newton_version_1.shen +33 -33
  62. data/shen/release/test_programs/newton_version_2.shen +24 -24
  63. data/shen/release/test_programs/parse.prl +14 -14
  64. data/shen/release/test_programs/parser.shen +51 -51
  65. data/shen/release/test_programs/powerset.shen +10 -10
  66. data/shen/release/test_programs/prime.shen +10 -10
  67. data/shen/release/test_programs/prolog.shen +78 -78
  68. data/shen/release/test_programs/proof_assistant.shen +80 -80
  69. data/shen/release/test_programs/proplog_version_1.shen +25 -25
  70. data/shen/release/test_programs/proplog_version_2.shen +27 -27
  71. data/shen/release/test_programs/qmachine.shen +66 -66
  72. data/shen/release/test_programs/red-black.shen +54 -54
  73. data/shen/release/test_programs/search.shen +55 -55
  74. data/shen/release/test_programs/semantic_net.shen +44 -44
  75. data/shen/release/test_programs/spreadsheet.shen +34 -34
  76. data/shen/release/test_programs/stack.shen +27 -27
  77. data/shen/release/test_programs/streams.shen +20 -20
  78. data/shen/release/test_programs/strings.shen +57 -57
  79. data/shen/release/test_programs/structures-typed.shen +71 -71
  80. data/shen/release/test_programs/structures-untyped.shen +41 -41
  81. data/shen/release/test_programs/tests.shen +232 -232
  82. data/shen/release/test_programs/types.shen +11 -11
  83. data/shen/release/test_programs/whist.shen +239 -239
  84. data/shen/release/test_programs/yacc.shen +132 -132
  85. data/spec/shen_ruby/converters_spec.rb +48 -0
  86. data/spec/spec_helper.rb +1 -2
  87. metadata +55 -60
  88. data/k_lambda_spec/atom_spec.rb +0 -85
  89. data/k_lambda_spec/primitives/arithmetic_spec.rb +0 -175
  90. data/k_lambda_spec/primitives/assignments_spec.rb +0 -44
  91. data/k_lambda_spec/primitives/boolean_operations_spec.rb +0 -136
  92. data/k_lambda_spec/primitives/generic_functions_spec.rb +0 -120
  93. data/k_lambda_spec/primitives/lists_spec.rb +0 -40
  94. data/k_lambda_spec/primitives/strings_spec.rb +0 -77
  95. data/k_lambda_spec/primitives/symbols_spec.rb +0 -24
  96. data/k_lambda_spec/primitives/vectors_spec.rb +0 -92
  97. data/k_lambda_spec/spec_helper.rb +0 -29
  98. data/k_lambda_spec/support/shared_examples.rb +0 -124
  99. data/k_lambda_spec/tail_recursion_spec.rb +0 -30
  100. data/lib/kl.rb +0 -7
  101. data/lib/kl/absvector.rb +0 -12
  102. data/lib/kl/compiler.rb +0 -360
  103. data/lib/kl/cons.rb +0 -51
  104. data/lib/kl/empty_list.rb +0 -12
  105. data/lib/kl/environment.rb +0 -163
  106. data/lib/kl/error.rb +0 -4
  107. data/lib/kl/internal_error.rb +0 -7
  108. data/lib/kl/lexer.rb +0 -186
  109. data/lib/kl/primitives/arithmetic.rb +0 -60
  110. data/lib/kl/primitives/assignments.rb +0 -15
  111. data/lib/kl/primitives/booleans.rb +0 -21
  112. data/lib/kl/primitives/error_handling.rb +0 -13
  113. data/lib/kl/primitives/extensions.rb +0 -12
  114. data/lib/kl/primitives/generic_functions.rb +0 -29
  115. data/lib/kl/primitives/lists.rb +0 -23
  116. data/lib/kl/primitives/streams.rb +0 -28
  117. data/lib/kl/primitives/strings.rb +0 -63
  118. data/lib/kl/primitives/symbols.rb +0 -18
  119. data/lib/kl/primitives/time.rb +0 -17
  120. data/lib/kl/primitives/vectors.rb +0 -36
  121. data/lib/kl/reader.rb +0 -46
  122. data/spec/kl/cons_spec.rb +0 -12
  123. data/spec/kl/environment_spec.rb +0 -282
  124. data/spec/kl/interop_spec.rb +0 -68
  125. data/spec/kl/lexer_spec.rb +0 -149
  126. data/spec/kl/primitives/generic_functions_spec.rb +0 -29
  127. data/spec/kl/primitives/symbols_spec.rb +0 -21
  128. data/spec/kl/reader_spec.rb +0 -42
@@ -1,45 +1,45 @@
1
- (define n-queens
2
- {number --> symbol}
3
- N -> (do (map (/. X (output "~A~%" X)) (n-queens-loop N (initialise N))) ok))
4
-
5
- (define initialise
6
- {number --> (list number)}
7
- 0 -> []
8
- N -> [1 | (initialise (- N 1))])
9
-
10
- (define n-queens-loop
11
- {number --> (list number) --> [(list number)]}
12
- N Config -> [] where (all_Ns? N Config)
13
- N Config -> [Config | (n-queens-loop N (next_n N Config))]
14
- where (and (ok_row? Config) (ok_diag? Config))
15
- N Config -> (n-queens-loop N (next_n N Config)))
16
-
17
- (define all_Ns?
18
- {number --> (list number) --> boolean}
19
- _ [] -> true
20
- N [N | Ns] -> (all_Ns? N Ns)
21
- _ _ -> false)
22
-
23
- (define next_n
24
- {number --> (list number) --> (list number)}
25
- N [N | Ns] -> [1 | (next_n N Ns)]
26
- _ [N | Ns] -> [(+ 1 N) | Ns])
27
-
28
- (define ok_row?
29
- {(list number) --> boolean}
30
- [] -> true
31
- [N | Ns] -> false where (element? N Ns)
32
- [_ | Ns] -> (ok_row? Ns))
33
-
34
- (define ok_diag?
35
- {(list number) --> boolean}
36
- [] -> true
37
- [N | Ns] -> (and (ok_diag_N? (+ N 1) (- N 1) Ns)
38
- (ok_diag? Ns)))
39
-
40
- (define ok_diag_N?
41
- {number --> number --> (list number) --> boolean}
42
- _ _ [] -> true
43
- Up Down [Up | _] -> false
44
- Up Down [Down | _] -> false
45
- Up Down [_ | Ns] -> (ok_diag_N? (+ 1 Up) (- Down 1) Ns))
1
+ (define n-queens
2
+ {number --> symbol}
3
+ N -> (do (map (/. X (output "~A~%" X)) (n-queens-loop N (initialise N))) ok))
4
+
5
+ (define initialise
6
+ {number --> (list number)}
7
+ 0 -> []
8
+ N -> [1 | (initialise (- N 1))])
9
+
10
+ (define n-queens-loop
11
+ {number --> (list number) --> [(list number)]}
12
+ N Config -> [] where (all_Ns? N Config)
13
+ N Config -> [Config | (n-queens-loop N (next_n N Config))]
14
+ where (and (ok_row? Config) (ok_diag? Config))
15
+ N Config -> (n-queens-loop N (next_n N Config)))
16
+
17
+ (define all_Ns?
18
+ {number --> (list number) --> boolean}
19
+ _ [] -> true
20
+ N [N | Ns] -> (all_Ns? N Ns)
21
+ _ _ -> false)
22
+
23
+ (define next_n
24
+ {number --> (list number) --> (list number)}
25
+ N [N | Ns] -> [1 | (next_n N Ns)]
26
+ _ [N | Ns] -> [(+ 1 N) | Ns])
27
+
28
+ (define ok_row?
29
+ {(list number) --> boolean}
30
+ [] -> true
31
+ [N | Ns] -> false where (element? N Ns)
32
+ [_ | Ns] -> (ok_row? Ns))
33
+
34
+ (define ok_diag?
35
+ {(list number) --> boolean}
36
+ [] -> true
37
+ [N | Ns] -> (and (ok_diag_N? (+ N 1) (- N 1) Ns)
38
+ (ok_diag? Ns)))
39
+
40
+ (define ok_diag_N?
41
+ {number --> number --> (list number) --> boolean}
42
+ _ _ [] -> true
43
+ Up Down [Up | _] -> false
44
+ Up Down [Down | _] -> false
45
+ Up Down [_ | Ns] -> (ok_diag_N? (+ 1 Up) (- Down 1) Ns))
@@ -1,14 +1,14 @@
1
- \*
2
-
3
- This is the benchmark macro for Shen. Assuming your port to Blub is in the directory Platforms/Blub; do the
4
- following.
5
-
6
- 1. (cd "../../Benchmarks")
7
- 2. (load "README.shen")
8
- 3. (load "benchmarks.shen")
9
-
10
- *\
11
-
12
- (defmacro benchmark-macro
13
- [benchmark Message Benchmark] -> [do [nl] [output Message] [time Benchmark]])
14
-
1
+ \*
2
+
3
+ This is the benchmark macro for Shen. Assuming your port to Blub is in the directory Platforms/Blub; do the
4
+ following.
5
+
6
+ 1. (cd "../../Benchmarks")
7
+ 2. (load "README.shen")
8
+ 3. (load "benchmarks.shen")
9
+
10
+ *\
11
+
12
+ (defmacro benchmark-macro
13
+ [benchmark Message Benchmark] -> [do [nl] [output Message] [time Benchmark]])
14
+
@@ -1,52 +1,52 @@
1
- (benchmark "read a 10K binary file" (read-file-as-bytelist "plato.jpg"))
2
-
3
- (benchmark "read a 105K binary file" (read-file-as-bytelist "heatwave.gif"))
4
-
5
- (benchmark "parse a 7K Shen file" (read-file "interpreter.shen"))
6
-
7
- (benchmark "compile a 130 LOC Qi program" (load "short.shen"))
8
-
9
- (benchmark "compile a 27 line Prolog program" (load "einstein.shen"))
10
-
11
- (benchmark "solve Einstein's puzzle" (prolog? (einsteins_riddle X) (return X)))
12
-
13
- (load "powerset.shen")
14
-
15
- (benchmark "powerset of 14 numbers" (powerset [1 2 3 4 5 6 7 8 9 10 11 12 13 14]))
16
-
17
- (do (set *str* (hd (read-file "text.txt"))) ok)
18
-
19
- (define remstr
20
- "" -> 0
21
- (@s "er" S) -> (+ 1 (remstr S))
22
- (@s _ Ss) -> (remstr Ss))
23
-
24
- (benchmark "count 'er' in a string" (remstr (value *str*)))
25
-
26
- (define vectorn
27
- 0 -> <>
28
- N -> (@v N (vectorn (- N 1))))
29
-
30
- (define vectorp
31
- <> -> <>
32
- (@v X Y) -> (@v (+ X 1) (vectorp Y))
33
- (@v X Y Z) -> (@v (+ X 1) (+ Y 2) (vectorp Z)))
34
-
35
- (benchmark "vector of 1000 elements" (vectorn 1000))
36
-
37
- (define tak
38
- X Y Z -> Z where (not (< Y X))
39
- X Y Z -> (tak (tak (- X 1) Y Z)
40
- (tak (- Y 1) Z X)
41
- (tak (- Z 1) X Y)))
42
-
43
- (benchmark "(tak 18 12 6)" (tak 18 12 6))
44
-
45
- (tc +)
46
-
47
- (benchmark "type checking the N queens" (load "N_queens.shen"))
48
-
49
- (benchmark "solving the N queens for N = 6" (n-queens 6))
50
-
51
- (benchmark "load and typecheck Qi interpreter" (load "interpreter.shen"))
52
-
1
+ (benchmark "read a 10K binary file" (read-file-as-bytelist "plato.jpg"))
2
+
3
+ (benchmark "read a 105K binary file" (read-file-as-bytelist "heatwave.gif"))
4
+
5
+ (benchmark "parse a 7K Shen file" (read-file "interpreter.shen"))
6
+
7
+ (benchmark "compile a 130 LOC Qi program" (load "short.shen"))
8
+
9
+ (benchmark "compile a 27 line Prolog program" (load "einstein.shen"))
10
+
11
+ (benchmark "solve Einstein's puzzle" (prolog? (einsteins_riddle X) (return X)))
12
+
13
+ (load "powerset.shen")
14
+
15
+ (benchmark "powerset of 14 numbers" (powerset [1 2 3 4 5 6 7 8 9 10 11 12 13 14]))
16
+
17
+ (do (set *str* (hd (read-file "text.txt"))) ok)
18
+
19
+ (define remstr
20
+ "" -> 0
21
+ (@s "er" S) -> (+ 1 (remstr S))
22
+ (@s _ Ss) -> (remstr Ss))
23
+
24
+ (benchmark "count 'er' in a string" (remstr (value *str*)))
25
+
26
+ (define vectorn
27
+ 0 -> <>
28
+ N -> (@v N (vectorn (- N 1))))
29
+
30
+ (define vectorp
31
+ <> -> <>
32
+ (@v X Y) -> (@v (+ X 1) (vectorp Y))
33
+ (@v X Y Z) -> (@v (+ X 1) (+ Y 2) (vectorp Z)))
34
+
35
+ (benchmark "vector of 1000 elements" (vectorn 1000))
36
+
37
+ (define tak
38
+ X Y Z -> Z where (not (< Y X))
39
+ X Y Z -> (tak (tak (- X 1) Y Z)
40
+ (tak (- Y 1) Z X)
41
+ (tak (- Z 1) X Y)))
42
+
43
+ (benchmark "(tak 18 12 6)" (tak 18 12 6))
44
+
45
+ (tc +)
46
+
47
+ (benchmark "type checking the N queens" (load "N_queens.shen"))
48
+
49
+ (benchmark "solving the N queens for N = 6" (n-queens 6))
50
+
51
+ (benchmark "load and typecheck Qi interpreter" (load "interpreter.shen"))
52
+
@@ -1,33 +1,33 @@
1
- (defprolog einsteins_riddle
2
- Fish_Owner <-- (einstein Houses Fish_Owner);)
3
-
4
- (defprolog einstein
5
- Houses Fish_Owner <-- (unify Houses [[house norwegian _ _ _ _] _ [house _ _ _ milk _] _ _])
6
- (member [house brit _ _ _ red] Houses)
7
- (member [house swede dog _ _ _] Houses)
8
- (member [house dane _ _ tea _] Houses)
9
- (iright [house _ _ _ _ green] [house _ _ _ _ white] Houses)
10
- (member [house _ _ _ coffee green] Houses)
11
- (member [house _ bird pallmall _ _] Houses)
12
- (member [house _ _ dunhill _ yellow] Houses)
13
- (next_to [house _ _ dunhill _ _] [house _ horse _ _ _] Houses)
14
- (member [house _ _ _ milk _] Houses)
15
- (next_to [house _ _ marlboro _ _] [house _ cat _ _ _] Houses)
16
- (next_to [house _ _ marlboro _ _] [house _ _ _ water _] Houses)
17
- (member [house _ _ winfield beer _] Houses)
18
- (member [house german _ rothmans _ _] Houses)
19
- (next_to [house norwegian _ _ _ _] [house _ _ _ _ blue] Houses)
20
- (unify Houses [[house norwegian _ _ _ _] _ [house _ _ _ milk _] _ _])
21
- (member [house Fish_Owner fish _ _ _] Houses);)
22
-
23
- (defprolog member
24
- X [X | _] <--;
25
- X [_ | Z] <-- (member X Z);)
26
-
27
- (defprolog next_to
28
- X Y List <-- (iright X Y List);
29
- X Y List <-- (iright Y X List);)
30
-
31
- (defprolog iright
32
- L R [L | [R | _]] <--;
1
+ (defprolog einsteins_riddle
2
+ Fish_Owner <-- (einstein Houses Fish_Owner);)
3
+
4
+ (defprolog einstein
5
+ Houses Fish_Owner <-- (unify Houses [[house norwegian _ _ _ _] _ [house _ _ _ milk _] _ _])
6
+ (member [house brit _ _ _ red] Houses)
7
+ (member [house swede dog _ _ _] Houses)
8
+ (member [house dane _ _ tea _] Houses)
9
+ (iright [house _ _ _ _ green] [house _ _ _ _ white] Houses)
10
+ (member [house _ _ _ coffee green] Houses)
11
+ (member [house _ bird pallmall _ _] Houses)
12
+ (member [house _ _ dunhill _ yellow] Houses)
13
+ (next_to [house _ _ dunhill _ _] [house _ horse _ _ _] Houses)
14
+ (member [house _ _ _ milk _] Houses)
15
+ (next_to [house _ _ marlboro _ _] [house _ cat _ _ _] Houses)
16
+ (next_to [house _ _ marlboro _ _] [house _ _ _ water _] Houses)
17
+ (member [house _ _ winfield beer _] Houses)
18
+ (member [house german _ rothmans _ _] Houses)
19
+ (next_to [house norwegian _ _ _ _] [house _ _ _ _ blue] Houses)
20
+ (unify Houses [[house norwegian _ _ _ _] _ [house _ _ _ milk _] _ _])
21
+ (member [house Fish_Owner fish _ _ _] Houses);)
22
+
23
+ (defprolog member
24
+ X [X | _] <--;
25
+ X [_ | Z] <-- (member X Z);)
26
+
27
+ (defprolog next_to
28
+ X Y List <-- (iright X Y List);
29
+ X Y List <-- (iright Y X List);)
30
+
31
+ (defprolog iright
32
+ L R [L | [R | _]] <--;
33
33
  L R [_ | Rest] <-- (iright L R Rest);)
@@ -1,219 +1,219 @@
1
- (datatype num
2
-
3
- ____________________________________
4
- (number? X) : verified >> X : number;)
5
-
6
- (datatype primitive_object
7
-
8
- if (variable? X)
9
- _______________
10
- X : variable;
11
-
12
- X : variable;
13
- _____________
14
- X : primitive_object;
15
-
16
- X : symbol;
17
- ___________
18
- X : primitive_object;
19
-
20
- X : string;
21
- ___________
22
- X : primitive_object;
23
-
24
- X : boolean;
25
- ___________
26
- X : primitive_object;
27
-
28
- X : number;
29
- ___________
30
- X : primitive_object;
31
-
32
- _____________________
33
- [] : primitive_object;)
34
-
35
- (datatype pattern
36
-
37
- X : primitive_object;
38
- ___________
39
- X : pattern;
40
-
41
- P1 : pattern; P2 : pattern;
42
- ===========================
43
- [cons P1 P2] : pattern;
44
-
45
- P1 : pattern; P2 : pattern;
46
- ===========================
47
- [@p P1 P2] : pattern;)
48
-
49
- (datatype l_formula
50
-
51
- X : pattern;
52
- _____________
53
- X : l_formula;
54
-
55
- X : l_formula; Y : l_formula; Z : l_formula;
56
- =================================
57
- [if X Y Z] : l_formula;
58
-
59
- X : variable; Y : l_formula; Z : l_formula;
60
- ================================
61
- [let X Y Z] : l_formula;
62
-
63
- X : l_formula; Y : l_formula;
64
- ======================
65
- [cons X Y] : l_formula;
66
-
67
- X : l_formula; Y : l_formula;
68
- ======================
69
- [@p X Y] : l_formula;
70
-
71
- X : l_formula; Y : l_formula;
72
- ======================
73
- [where X Y] : l_formula;
74
-
75
- X : l_formula; Y : l_formula;
76
- ======================
77
- [= X Y] : l_formula;
78
-
79
- X : l_formula; Y : l_formula;
80
- ======================
81
- [X Y] : l_formula;
82
-
83
- Xn : (list l_formula);
84
- ===================
85
- [cases | Xn] : l_formula;
86
-
87
- P : pattern; X : l_formula;
88
- ===========================
89
- [/. P X] : l_formula;)
90
-
91
- (define l_interpreter
92
- {A --> B}
93
- _ -> (read_eval_print_loop (output "~%L interpreter ~%~%~%~%l-interp --> ~A~%"
94
- (normal_form (input+ : l_formula)))))
95
-
96
- (define read_eval_print_loop
97
- {string --> A}
98
- _ -> (read_eval_print_loop
99
- (output "l-interp --> ~A~%"
100
- (normal_form (input+ : l_formula)))))
101
-
102
- (define normal_form
103
- {l_formula --> l_formula}
104
- X -> (fix (function ==>>) X))
105
-
106
- (define ==>>
107
- {l_formula --> l_formula}
108
- [= X Y] -> (let X* (normal_form X)
109
- (let Y* (normal_form Y)
110
- (if (or (eval_error? X*) (eval_error? Y*))
111
- "error!"
112
- (if (= X* Y*) true false))))
113
- [[/. P X] Y] -> (let Match (match P (normal_form Y))
114
- (if (no_match? Match)
115
- "no match"
116
- (sub Match X)))
117
- [if X Y Z] -> (let X* (normal_form X)
118
- (if (= X* true)
119
- Y
120
- (if (= X* false)
121
- Z
122
- "error!")))
123
- [let X Y Z] -> [[/. X Z] Y]
124
- [@p X Y] -> (let X* (normal_form X)
125
- (let Y* (normal_form Y)
126
- (if (or (eval_error? X*) (eval_error? Y*))
127
- "error!"
128
- [@p X* Y*])))
129
- [cons X Y] -> (let X* (normal_form X)
130
- (let Y* (normal_form Y)
131
- (if (or (eval_error? X*) (eval_error? Y*))
132
- "error!"
133
- [cons X* Y*])))
134
- [++ X] -> (successor (normal_form X))
135
- [-- X] -> (predecessor (normal_form X))
136
- \*[cases X1 | Xn] -> (let Case1 (normal_form X1)
137
- (if (= Case1 "no match")
138
- [cases | Xn]
139
- Case1))
140
- [cases] -> "error!"
141
- [where X Y] -> [if X Y "no match"]
142
- [y-combinator [/. X Y]] -> (replace X [y-combinator [/. X Y]] Y)
143
- [X Y] -> (let X* (normal_form X)
144
- (let Y* (normal_form Y)
145
- (if (or (eval_error? X*) (eval_error? Y*))
146
- "error!"
147
- [X* Y*])))*\
148
- X -> X)
149
-
150
- (define eval_error?
151
- {l_formula --> boolean}
152
- "error!" -> true
153
- "no match" -> true
154
- _ -> false)
155
-
156
- (define successor
157
- {A --> l_formula}
158
- X -> (+ 1 X) where (number? X)
159
- _ -> "error!")
160
-
161
- (define predecessor
162
- {A --> l_formula}
163
- X -> (- X 1) where (number? X)
164
- _ -> "error!")
165
-
166
- \* (spy +) *\
167
-
168
- (define sub
169
- {[(pattern * l_formula)] --> l_formula --> l_formula}
170
- [] X -> X
171
- [(@p Var Val) | Assoc] X -> (sub Assoc (replace Var Val X)))
172
-
173
- (define match
174
- {pattern --> l_formula --> (list (pattern * l_formula))}
175
- P X -> [] where (== P X)
176
- P X -> [(@p P X)] where (variable? P)
177
- [cons P1 P2] [cons X Y] -> (let Match1 (match P1 X)
178
- (if (no_match? Match1)
179
- Match1
180
- (let Match2 (match P2 Y)
181
- (if (no_match? Match2)
182
- Match2
183
- (append Match1 Match2)))))
184
- [@p P1 P2] [@p X Y] -> (let Match1 (match P1 X)
185
- (if (no_match? Match1)
186
- Match1
187
- (let Match2 (match P2 Y)
188
- (if (no_match? Match2)
189
- Match2
190
- (append Match1 Match2)))))
191
-
192
- _ _ -> [(@p no matching)])
193
-
194
- (define no_match?
195
- {[(pattern * l_formula)] --> boolean}
196
- [(@p no matching)] -> true
197
- _ -> false)
198
-
199
- (define replace
200
- {pattern --> l_formula --> l_formula --> l_formula}
201
- V W [let V* X Y] -> [let V* X Y] where (== V V*)
202
- X Y X -> Y
203
- V W [= X Y] -> [= (replace V W X) (replace V W Y)]
204
- V W [/. P X] -> [/. P (replace V W X)] where (free? V P)
205
- V W [if X Y Z] -> [if (replace V W X) (replace V W Y) (replace V W Z)]
206
- V W [let X Y Z] -> [let X (replace V W Y) (replace V W Z)]
207
- V W [@p X Y] -> [@p (replace V W X) (replace V W Y)]
208
- V W [cons X Y] -> [cons (replace V W X) (replace V W Y)]
209
- V W [cases | Xn] -> [cases | (map (/. Xi (replace V W Xi)) Xn)]
210
- V W [where X Y] -> [where (replace V W X) (replace V W Y)]
211
- V W [X Y] -> [(replace V W X) (replace V W Y)]
212
- _ _ X -> X)
213
-
214
- (define free?
215
- {pattern --> pattern --> boolean}
216
- P P -> false
217
- P [cons P1 P2] -> (and (free? P P1) (free? P P2))
218
- P [@p P1 P2] -> (and (free? P P1) (free? P P2))
219
- _ _ -> true)
1
+ (datatype num
2
+
3
+ ____________________________________
4
+ (number? X) : verified >> X : number;)
5
+
6
+ (datatype primitive_object
7
+
8
+ if (variable? X)
9
+ _______________
10
+ X : variable;
11
+
12
+ X : variable;
13
+ _____________
14
+ X : primitive_object;
15
+
16
+ X : symbol;
17
+ ___________
18
+ X : primitive_object;
19
+
20
+ X : string;
21
+ ___________
22
+ X : primitive_object;
23
+
24
+ X : boolean;
25
+ ___________
26
+ X : primitive_object;
27
+
28
+ X : number;
29
+ ___________
30
+ X : primitive_object;
31
+
32
+ _____________________
33
+ [] : primitive_object;)
34
+
35
+ (datatype pattern
36
+
37
+ X : primitive_object;
38
+ ___________
39
+ X : pattern;
40
+
41
+ P1 : pattern; P2 : pattern;
42
+ ===========================
43
+ [cons P1 P2] : pattern;
44
+
45
+ P1 : pattern; P2 : pattern;
46
+ ===========================
47
+ [@p P1 P2] : pattern;)
48
+
49
+ (datatype l_formula
50
+
51
+ X : pattern;
52
+ _____________
53
+ X : l_formula;
54
+
55
+ X : l_formula; Y : l_formula; Z : l_formula;
56
+ =================================
57
+ [if X Y Z] : l_formula;
58
+
59
+ X : variable; Y : l_formula; Z : l_formula;
60
+ ================================
61
+ [let X Y Z] : l_formula;
62
+
63
+ X : l_formula; Y : l_formula;
64
+ ======================
65
+ [cons X Y] : l_formula;
66
+
67
+ X : l_formula; Y : l_formula;
68
+ ======================
69
+ [@p X Y] : l_formula;
70
+
71
+ X : l_formula; Y : l_formula;
72
+ ======================
73
+ [where X Y] : l_formula;
74
+
75
+ X : l_formula; Y : l_formula;
76
+ ======================
77
+ [= X Y] : l_formula;
78
+
79
+ X : l_formula; Y : l_formula;
80
+ ======================
81
+ [X Y] : l_formula;
82
+
83
+ Xn : (list l_formula);
84
+ ===================
85
+ [cases | Xn] : l_formula;
86
+
87
+ P : pattern; X : l_formula;
88
+ ===========================
89
+ [/. P X] : l_formula;)
90
+
91
+ (define l_interpreter
92
+ {A --> B}
93
+ _ -> (read_eval_print_loop (output "~%L interpreter ~%~%~%~%l-interp --> ~A~%"
94
+ (normal_form (input+ : l_formula)))))
95
+
96
+ (define read_eval_print_loop
97
+ {string --> A}
98
+ _ -> (read_eval_print_loop
99
+ (output "l-interp --> ~A~%"
100
+ (normal_form (input+ : l_formula)))))
101
+
102
+ (define normal_form
103
+ {l_formula --> l_formula}
104
+ X -> (fix (function ==>>) X))
105
+
106
+ (define ==>>
107
+ {l_formula --> l_formula}
108
+ [= X Y] -> (let X* (normal_form X)
109
+ (let Y* (normal_form Y)
110
+ (if (or (eval_error? X*) (eval_error? Y*))
111
+ "error!"
112
+ (if (= X* Y*) true false))))
113
+ [[/. P X] Y] -> (let Match (match P (normal_form Y))
114
+ (if (no_match? Match)
115
+ "no match"
116
+ (sub Match X)))
117
+ [if X Y Z] -> (let X* (normal_form X)
118
+ (if (= X* true)
119
+ Y
120
+ (if (= X* false)
121
+ Z
122
+ "error!")))
123
+ [let X Y Z] -> [[/. X Z] Y]
124
+ [@p X Y] -> (let X* (normal_form X)
125
+ (let Y* (normal_form Y)
126
+ (if (or (eval_error? X*) (eval_error? Y*))
127
+ "error!"
128
+ [@p X* Y*])))
129
+ [cons X Y] -> (let X* (normal_form X)
130
+ (let Y* (normal_form Y)
131
+ (if (or (eval_error? X*) (eval_error? Y*))
132
+ "error!"
133
+ [cons X* Y*])))
134
+ [++ X] -> (successor (normal_form X))
135
+ [-- X] -> (predecessor (normal_form X))
136
+ \*[cases X1 | Xn] -> (let Case1 (normal_form X1)
137
+ (if (= Case1 "no match")
138
+ [cases | Xn]
139
+ Case1))
140
+ [cases] -> "error!"
141
+ [where X Y] -> [if X Y "no match"]
142
+ [y-combinator [/. X Y]] -> (replace X [y-combinator [/. X Y]] Y)
143
+ [X Y] -> (let X* (normal_form X)
144
+ (let Y* (normal_form Y)
145
+ (if (or (eval_error? X*) (eval_error? Y*))
146
+ "error!"
147
+ [X* Y*])))*\
148
+ X -> X)
149
+
150
+ (define eval_error?
151
+ {l_formula --> boolean}
152
+ "error!" -> true
153
+ "no match" -> true
154
+ _ -> false)
155
+
156
+ (define successor
157
+ {A --> l_formula}
158
+ X -> (+ 1 X) where (number? X)
159
+ _ -> "error!")
160
+
161
+ (define predecessor
162
+ {A --> l_formula}
163
+ X -> (- X 1) where (number? X)
164
+ _ -> "error!")
165
+
166
+ \* (spy +) *\
167
+
168
+ (define sub
169
+ {[(pattern * l_formula)] --> l_formula --> l_formula}
170
+ [] X -> X
171
+ [(@p Var Val) | Assoc] X -> (sub Assoc (replace Var Val X)))
172
+
173
+ (define match
174
+ {pattern --> l_formula --> (list (pattern * l_formula))}
175
+ P X -> [] where (== P X)
176
+ P X -> [(@p P X)] where (variable? P)
177
+ [cons P1 P2] [cons X Y] -> (let Match1 (match P1 X)
178
+ (if (no_match? Match1)
179
+ Match1
180
+ (let Match2 (match P2 Y)
181
+ (if (no_match? Match2)
182
+ Match2
183
+ (append Match1 Match2)))))
184
+ [@p P1 P2] [@p X Y] -> (let Match1 (match P1 X)
185
+ (if (no_match? Match1)
186
+ Match1
187
+ (let Match2 (match P2 Y)
188
+ (if (no_match? Match2)
189
+ Match2
190
+ (append Match1 Match2)))))
191
+
192
+ _ _ -> [(@p no matching)])
193
+
194
+ (define no_match?
195
+ {[(pattern * l_formula)] --> boolean}
196
+ [(@p no matching)] -> true
197
+ _ -> false)
198
+
199
+ (define replace
200
+ {pattern --> l_formula --> l_formula --> l_formula}
201
+ V W [let V* X Y] -> [let V* X Y] where (== V V*)
202
+ X Y X -> Y
203
+ V W [= X Y] -> [= (replace V W X) (replace V W Y)]
204
+ V W [/. P X] -> [/. P (replace V W X)] where (free? V P)
205
+ V W [if X Y Z] -> [if (replace V W X) (replace V W Y) (replace V W Z)]
206
+ V W [let X Y Z] -> [let X (replace V W Y) (replace V W Z)]
207
+ V W [@p X Y] -> [@p (replace V W X) (replace V W Y)]
208
+ V W [cons X Y] -> [cons (replace V W X) (replace V W Y)]
209
+ V W [cases | Xn] -> [cases | (map (/. Xi (replace V W Xi)) Xn)]
210
+ V W [where X Y] -> [where (replace V W X) (replace V W Y)]
211
+ V W [X Y] -> [(replace V W X) (replace V W Y)]
212
+ _ _ X -> X)
213
+
214
+ (define free?
215
+ {pattern --> pattern --> boolean}
216
+ P P -> false
217
+ P [cons P1 P2] -> (and (free? P P1) (free? P P2))
218
+ P [@p P1 P2] -> (and (free? P P1) (free? P P2))
219
+ _ _ -> true)