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,85 +1,85 @@
1
- (define parse
2
- D Sentence -> (let Parse (D [Sentence []])
3
- (if (parsed? Parse) (output_parse Parse) ungrammatical)))
4
-
5
- (define parsed?
6
- [[] Output] -> true
7
- _ -> false)
8
-
9
- (define output_parse
10
- [_ Output] -> Output)
11
-
12
- (define generate_parser
13
- Grammar -> (map (/. X (compile_rules X)) (group_rules (parenthesise_rules Grammar))))
14
-
15
- (define parenthesise_rules
16
- [S --> | Rest] -> (parenthesise_rules1 [S -->] Rest))
17
-
18
- (define parenthesise_rules1
19
- Rule [] -> [Rule]
20
- Rule [S --> | Rest] -> [Rule | (parenthesise_rules1 [S -->] Rest)]
21
- Rule [X | Y] -> (parenthesise_rules1 (append Rule [X]) Y))
22
-
23
- (define group_rules
24
- Rules -> (group_rules1 Rules []))
25
-
26
- (define group_rules1
27
- [] Groups -> Groups
28
- [Rule | Rules] Groups -> (group_rules1 Rules (place_in_group Rule Groups)))
29
-
30
- (define place_in_group
31
- Rule [] -> [[Rule]]
32
- Rule [Group | Groups] -> [[Rule | Group] | Groups]
33
- where (belongs-in? Rule Group)
34
- Rule [Group | Groups] -> [Group | (place_in_group Rule Groups)])
35
-
36
- (define belongs-in?
37
- [S | _] [[S | _] | _] -> true
38
- _ _ -> false)
39
-
40
- (define compile_rules
41
- Rules -> (if (lex? Rules)
42
- (generate_code_for_lex Rules)
43
- (generate_code_for_nonlex Rules)))
44
-
45
- (define lex?
46
- [[S --> Terminal] | _] -> (string? Terminal)
47
- _ -> false)
48
-
49
- (define generate_code_for_nonlex
50
- Rules -> (eval (append [define (get_characteristic_non_terminal Rules)
51
- | (mapapp gcfn_help Rules)]
52
- [(protect X) -> [fail]])))
53
-
54
- (define mapapp
55
- _ [] -> []
56
- F [X | Y] -> (append (F X) (mapapp F Y)))
57
-
58
- (define get_characteristic_non_terminal
59
- [[CNT | _] | _] -> CNT)
60
-
61
- (define gcfn_help
62
- Rule -> [(protect Parameter)
63
- <-
64
- (apply_expansion Rule
65
- [listit [head (protect Parameter)]
66
- [cons [listit | Rule]
67
- [head [tail (protect Parameter)]]]])])
68
-
69
- (define apply_expansion
70
- [CNT --> | Expansion] Parameter -> (ae_help Expansion Parameter))
71
-
72
- (define ae_help
73
- [] Code -> Code
74
- [NT | Expansion] Code -> (ae_help Expansion [NT Code]))
75
-
76
- (define generate_code_for_lex
77
- Rules -> (eval (append [define (get_characteristic_non_terminal Rules)
78
- (protect X) -> [fail] where [= (protect X) [fail]]
79
- | (mapapp (function gcfl_help) Rules)]
80
- [(protect X) -> [fail]])))
81
-
82
- (define gcfl_help
83
- [CNT --> Terminal] -> [[cons [cons Terminal (protect P)] [cons (protect Parse) []]]
84
- -> [listit (protect P) [cons [listit CNT --> Terminal] (protect Parse)]]])
85
-
1
+ (define parse
2
+ D Sentence -> (let Parse (D [Sentence []])
3
+ (if (parsed? Parse) (output_parse Parse) ungrammatical)))
4
+
5
+ (define parsed?
6
+ [[] Output] -> true
7
+ _ -> false)
8
+
9
+ (define output_parse
10
+ [_ Output] -> Output)
11
+
12
+ (define generate_parser
13
+ Grammar -> (map (/. X (compile_rules X)) (group_rules (parenthesise_rules Grammar))))
14
+
15
+ (define parenthesise_rules
16
+ [S --> | Rest] -> (parenthesise_rules1 [S -->] Rest))
17
+
18
+ (define parenthesise_rules1
19
+ Rule [] -> [Rule]
20
+ Rule [S --> | Rest] -> [Rule | (parenthesise_rules1 [S -->] Rest)]
21
+ Rule [X | Y] -> (parenthesise_rules1 (append Rule [X]) Y))
22
+
23
+ (define group_rules
24
+ Rules -> (group_rules1 Rules []))
25
+
26
+ (define group_rules1
27
+ [] Groups -> Groups
28
+ [Rule | Rules] Groups -> (group_rules1 Rules (place_in_group Rule Groups)))
29
+
30
+ (define place_in_group
31
+ Rule [] -> [[Rule]]
32
+ Rule [Group | Groups] -> [[Rule | Group] | Groups]
33
+ where (belongs-in? Rule Group)
34
+ Rule [Group | Groups] -> [Group | (place_in_group Rule Groups)])
35
+
36
+ (define belongs-in?
37
+ [S | _] [[S | _] | _] -> true
38
+ _ _ -> false)
39
+
40
+ (define compile_rules
41
+ Rules -> (if (lex? Rules)
42
+ (generate_code_for_lex Rules)
43
+ (generate_code_for_nonlex Rules)))
44
+
45
+ (define lex?
46
+ [[S --> Terminal] | _] -> (string? Terminal)
47
+ _ -> false)
48
+
49
+ (define generate_code_for_nonlex
50
+ Rules -> (eval (append [define (get_characteristic_non_terminal Rules)
51
+ | (mapapp gcfn_help Rules)]
52
+ [(protect X) -> [fail]])))
53
+
54
+ (define mapapp
55
+ _ [] -> []
56
+ F [X | Y] -> (append (F X) (mapapp F Y)))
57
+
58
+ (define get_characteristic_non_terminal
59
+ [[CNT | _] | _] -> CNT)
60
+
61
+ (define gcfn_help
62
+ Rule -> [(protect Parameter)
63
+ <-
64
+ (apply_expansion Rule
65
+ [listit [head (protect Parameter)]
66
+ [cons [listit | Rule]
67
+ [head [tail (protect Parameter)]]]])])
68
+
69
+ (define apply_expansion
70
+ [CNT --> | Expansion] Parameter -> (ae_help Expansion Parameter))
71
+
72
+ (define ae_help
73
+ [] Code -> Code
74
+ [NT | Expansion] Code -> (ae_help Expansion [NT Code]))
75
+
76
+ (define generate_code_for_lex
77
+ Rules -> (eval (append [define (get_characteristic_non_terminal Rules)
78
+ (protect X) -> [fail] where [= (protect X) [fail]]
79
+ | (mapapp (function gcfl_help) Rules)]
80
+ [(protect X) -> [fail]])))
81
+
82
+ (define gcfl_help
83
+ [CNT --> Terminal] -> [[cons [cons Terminal (protect P)] [cons (protect Parse) []]]
84
+ -> [listit (protect P) [cons [listit CNT --> Terminal] (protect Parse)]]])
85
+
@@ -1,193 +1,193 @@
1
- \* <program> := <statement> <program> | <statement>;
2
- <statement> := <assignment> | <conditional> | <goto> | <tag>;
3
- <assignment> := (<var> := <val>) | (++ <var>); (-- <var>);
4
- <var> := any symbol;
5
- <val> := any number
6
- <conditional> := (if <test> <statement> <statement>);
7
- <test> := (<var> <comp> <var); (<test> and <test>);
8
- (<test> or <test>) | (not <test>);
9
- <comp> := > | < | =; *\
10
-
11
- (synonyms program (list statement)
12
- env (list (symbol * number)))
13
-
14
- (datatype statement
15
-
16
- Var : symbol; Val : val;
17
- =========================
18
- [Var := Val] : statement;
19
-
20
- if (element? Op [++ --])
21
- Var : symbol;
22
- =====================
23
- [Op Var] : statement;
24
-
25
- Test : test; DoThis : statement; DoThat : statement;
26
- ====================================================
27
- [if Test then DoThis else DoThat] : statement;
28
-
29
- Tag : symbol;
30
- ======================
31
- [goto Tag] : statement;
32
-
33
- Message : string-or-val;
34
- ============================
35
- [print Message] : statement;
36
-
37
- Message : string;
38
- _________________
39
- Message : string-or-val;
40
-
41
- Message : val;
42
- _________________
43
- Message : string-or-val;
44
-
45
- Var : symbol;
46
- =========================
47
- [input Var] : statement;
48
-
49
- Tag : symbol;
50
- _____________
51
- Tag : statement;)
52
-
53
- (datatype test
54
-
55
- if (element? Comp [= > <])
56
- Val1 : val; Val2: val;
57
- ======================
58
- [Val1 Comp Val2] : test;
59
-
60
-
61
- if (element? LogOp [and or])
62
- Test1 : test;
63
- Test2 : test;
64
- =============
65
- [Test1 LogOp Test2] : test;
66
-
67
-
68
- Test : test;
69
- ==================
70
- [not Test] : test;)
71
-
72
-
73
- (datatype val
74
-
75
-
76
- ______________________________________
77
- (number? N) : verified >> N : number;
78
-
79
-
80
- _______________________________________
81
- (symbol? S) : verified >> S : symbol;
82
-
83
-
84
- Val : symbol;
85
- _______________
86
- Val : val;
87
-
88
-
89
- Val : number;
90
- _____________
91
- Val : val;)
92
-
93
-
94
- \* The program that runs Minim programs is 56 lines of Qi and is given here. *\
95
-
96
-
97
- (define run
98
- {program --> env}
99
- Program -> (run-loop Program Program []))
100
-
101
-
102
- (define run-loop
103
- {program --> program --> env --> env}
104
- [] _ Env -> Env
105
- [nl | Ss] Program Env -> (do (output "~%") (run-loop Ss Program Env))
106
- [Tag | Ss] Program Env -> (run-loop Ss Program Env) where (symbol? Tag)
107
- [[goto Tag] | _] Program Env -> (run-loop (go Tag Program) Program Env)
108
- [[Var := Val] | Ss] Program Env
109
- -> (run-loop Ss Program (change-env Var (compute-val Val Env) Env))
110
- [[++ Var] | Ss] Program Env
111
- -> (run-loop Ss Program (change-env Var (+ 1 (look-up Var Env)) Env))
112
- [[-- Var] | Ss] Program Env
113
- -> (run-loop Ss Program (change-env Var (- (look-up Var Env) 1) Env))
114
- [[if Test then DoThis else DoThat] | Ss] Program Env
115
- -> (if (perform-test? Test Env)
116
- (run-loop [DoThis | Ss] Program Env)
117
- (run-loop [DoThat | Ss] Program Env))
118
- [[print M] | Ss] Program Env -> (do (output "~A" (look-up M Env))
119
- (run-loop Ss Program Env))
120
- where (symbol? M)
121
- [[print M] | Ss] Program Env -> (do (output "~A" M)
122
- (run-loop Ss Program Env))
123
- [[input Var] | Ss] Program Env
124
- -> (run-loop Ss Program (change-env Var (input+ : number) Env)) )
125
-
126
- (define compute-val
127
- {val --> env --> number}
128
- N _ -> N where (number? N)
129
- Var Env -> (look-up Var Env) where (symbol? Var))
130
-
131
- (define go
132
- {symbol --> program --> program}
133
- Tag [Tag | Program] -> Program
134
- Tag [_ | Program] -> (go Tag Program)
135
- Tag _ -> (error "cannot go to tag ~A~%" Tag))
136
-
137
- (define perform-test?
138
- {test --> env --> boolean}
139
- [Test1 and Test2] Env -> (and (perform-test? Test1 Env)
140
- (perform-test? Test2 Env))
141
- [Test1 or Test2] Env -> (or (perform-test? Test1 Env)
142
- (perform-test? Test2 Env))
143
- [not Test] Env -> (not (perform-test? Test Env))
144
- [V1 = V2] Env -> (= (compute-val V1 Env) (compute-val V2 Env))
145
- [V1 > V2] Env -> (> (compute-val V1 Env) (compute-val V2 Env))
146
- [V1 < V2] Env -> (< (compute-val V1 Env) (compute-val V2 Env)))
147
-
148
- (define change-env
149
- {symbol --> number --> env --> env}
150
- Var Val [] -> [(@p Var Val)]
151
- Var Val [(@p Var _) | Env] -> [(@p Var Val) | Env]
152
- Var Val [Binding | Env] -> [Binding | (change-env Var Val Env)])
153
-
154
- (define look-up
155
- {symbol --> env --> number}
156
- Var [] -> (error "~A is unbound.~%" Var)
157
- Var [(@p Var Val) | _] -> Val
158
- Var [_ | Env] -> (look-up Var Env))
159
-
160
- \* (run [ [print "Add x and y"]
161
- nl
162
- [print "Input x: "]
163
- [input x]
164
- nl
165
- [print "Input y: "]
166
- [input y]
167
- main
168
- [if [x = 0] then [goto end] else [goto sub1x]]
169
-
170
-
171
- sub1x
172
- [-- x]
173
- [++ y]
174
- [goto main]
175
-
176
-
177
- end
178
- nl
179
- [print "The total of x and y is "]
180
- [print y]
181
- nl] ) *\
182
-
183
-
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
-
1
+ \* <program> := <statement> <program> | <statement>;
2
+ <statement> := <assignment> | <conditional> | <goto> | <tag>;
3
+ <assignment> := (<var> := <val>) | (++ <var>); (-- <var>);
4
+ <var> := any symbol;
5
+ <val> := any number
6
+ <conditional> := (if <test> <statement> <statement>);
7
+ <test> := (<var> <comp> <var); (<test> and <test>);
8
+ (<test> or <test>) | (not <test>);
9
+ <comp> := > | < | =; *\
10
+
11
+ (synonyms program (list statement)
12
+ env (list (symbol * number)))
13
+
14
+ (datatype statement
15
+
16
+ Var : symbol; Val : val;
17
+ =========================
18
+ [Var := Val] : statement;
19
+
20
+ if (element? Op [++ --])
21
+ Var : symbol;
22
+ =====================
23
+ [Op Var] : statement;
24
+
25
+ Test : test; DoThis : statement; DoThat : statement;
26
+ ====================================================
27
+ [if Test then DoThis else DoThat] : statement;
28
+
29
+ Tag : symbol;
30
+ ======================
31
+ [goto Tag] : statement;
32
+
33
+ Message : string-or-val;
34
+ ============================
35
+ [print Message] : statement;
36
+
37
+ Message : string;
38
+ _________________
39
+ Message : string-or-val;
40
+
41
+ Message : val;
42
+ _________________
43
+ Message : string-or-val;
44
+
45
+ Var : symbol;
46
+ =========================
47
+ [input Var] : statement;
48
+
49
+ Tag : symbol;
50
+ _____________
51
+ Tag : statement;)
52
+
53
+ (datatype test
54
+
55
+ if (element? Comp [= > <])
56
+ Val1 : val; Val2: val;
57
+ ======================
58
+ [Val1 Comp Val2] : test;
59
+
60
+
61
+ if (element? LogOp [and or])
62
+ Test1 : test;
63
+ Test2 : test;
64
+ =============
65
+ [Test1 LogOp Test2] : test;
66
+
67
+
68
+ Test : test;
69
+ ==================
70
+ [not Test] : test;)
71
+
72
+
73
+ (datatype val
74
+
75
+
76
+ ______________________________________
77
+ (number? N) : verified >> N : number;
78
+
79
+
80
+ _______________________________________
81
+ (symbol? S) : verified >> S : symbol;
82
+
83
+
84
+ Val : symbol;
85
+ _______________
86
+ Val : val;
87
+
88
+
89
+ Val : number;
90
+ _____________
91
+ Val : val;)
92
+
93
+
94
+ \* The program that runs Minim programs is 56 lines of Qi and is given here. *\
95
+
96
+
97
+ (define run
98
+ {program --> env}
99
+ Program -> (run-loop Program Program []))
100
+
101
+
102
+ (define run-loop
103
+ {program --> program --> env --> env}
104
+ [] _ Env -> Env
105
+ [nl | Ss] Program Env -> (do (output "~%") (run-loop Ss Program Env))
106
+ [Tag | Ss] Program Env -> (run-loop Ss Program Env) where (symbol? Tag)
107
+ [[goto Tag] | _] Program Env -> (run-loop (go Tag Program) Program Env)
108
+ [[Var := Val] | Ss] Program Env
109
+ -> (run-loop Ss Program (change-env Var (compute-val Val Env) Env))
110
+ [[++ Var] | Ss] Program Env
111
+ -> (run-loop Ss Program (change-env Var (+ 1 (look-up Var Env)) Env))
112
+ [[-- Var] | Ss] Program Env
113
+ -> (run-loop Ss Program (change-env Var (- (look-up Var Env) 1) Env))
114
+ [[if Test then DoThis else DoThat] | Ss] Program Env
115
+ -> (if (perform-test? Test Env)
116
+ (run-loop [DoThis | Ss] Program Env)
117
+ (run-loop [DoThat | Ss] Program Env))
118
+ [[print M] | Ss] Program Env -> (do (output "~A" (look-up M Env))
119
+ (run-loop Ss Program Env))
120
+ where (symbol? M)
121
+ [[print M] | Ss] Program Env -> (do (output "~A" M)
122
+ (run-loop Ss Program Env))
123
+ [[input Var] | Ss] Program Env
124
+ -> (run-loop Ss Program (change-env Var (input+ : number) Env)) )
125
+
126
+ (define compute-val
127
+ {val --> env --> number}
128
+ N _ -> N where (number? N)
129
+ Var Env -> (look-up Var Env) where (symbol? Var))
130
+
131
+ (define go
132
+ {symbol --> program --> program}
133
+ Tag [Tag | Program] -> Program
134
+ Tag [_ | Program] -> (go Tag Program)
135
+ Tag _ -> (error "cannot go to tag ~A~%" Tag))
136
+
137
+ (define perform-test?
138
+ {test --> env --> boolean}
139
+ [Test1 and Test2] Env -> (and (perform-test? Test1 Env)
140
+ (perform-test? Test2 Env))
141
+ [Test1 or Test2] Env -> (or (perform-test? Test1 Env)
142
+ (perform-test? Test2 Env))
143
+ [not Test] Env -> (not (perform-test? Test Env))
144
+ [V1 = V2] Env -> (= (compute-val V1 Env) (compute-val V2 Env))
145
+ [V1 > V2] Env -> (> (compute-val V1 Env) (compute-val V2 Env))
146
+ [V1 < V2] Env -> (< (compute-val V1 Env) (compute-val V2 Env)))
147
+
148
+ (define change-env
149
+ {symbol --> number --> env --> env}
150
+ Var Val [] -> [(@p Var Val)]
151
+ Var Val [(@p Var _) | Env] -> [(@p Var Val) | Env]
152
+ Var Val [Binding | Env] -> [Binding | (change-env Var Val Env)])
153
+
154
+ (define look-up
155
+ {symbol --> env --> number}
156
+ Var [] -> (error "~A is unbound.~%" Var)
157
+ Var [(@p Var Val) | _] -> Val
158
+ Var [_ | Env] -> (look-up Var Env))
159
+
160
+ \* (run [ [print "Add x and y"]
161
+ nl
162
+ [print "Input x: "]
163
+ [input x]
164
+ nl
165
+ [print "Input y: "]
166
+ [input y]
167
+ main
168
+ [if [x = 0] then [goto end] else [goto sub1x]]
169
+
170
+
171
+ sub1x
172
+ [-- x]
173
+ [++ y]
174
+ [goto main]
175
+
176
+
177
+ end
178
+ nl
179
+ [print "The total of x and y is "]
180
+ [print y]
181
+ nl] ) *\
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
193