shen-ruby 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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)