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.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/.travis.yml +9 -3
- data/Gemfile +1 -4
- data/HISTORY.md +16 -0
- data/MIT_LICENSE.txt +1 -1
- data/README.md +25 -26
- data/Rakefile +3 -11
- data/bin/shen_test_suite.rb +15 -3
- data/bin/srrepl +6 -8
- data/lib/shen_ruby.rb +6 -1
- data/lib/shen_ruby/converters.rb +23 -0
- data/lib/shen_ruby/version.rb +1 -1
- data/shen-ruby.gemspec +4 -1
- data/shen/lib/shen_ruby/shen.rb +49 -33
- data/shen/release/benchmarks/N_queens.shen +45 -45
- data/shen/release/benchmarks/README.shen +14 -14
- data/shen/release/benchmarks/benchmarks.shen +52 -52
- data/shen/release/benchmarks/einstein.shen +32 -32
- data/shen/release/benchmarks/interpreter.shen +219 -219
- data/shen/release/benchmarks/jnk.shen +193 -193
- data/shen/release/benchmarks/powerset.shen +10 -10
- data/shen/release/benchmarks/prime.shen +10 -10
- data/shen/release/benchmarks/short.shen +129 -129
- data/shen/release/k_lambda/core.kl +181 -181
- data/shen/release/k_lambda/declarations.kl +131 -131
- data/shen/release/k_lambda/load.kl +84 -84
- data/shen/release/k_lambda/macros.kl +112 -112
- data/shen/release/k_lambda/prolog.kl +252 -252
- data/shen/release/k_lambda/reader.kl +222 -222
- data/shen/release/k_lambda/sequent.kl +166 -166
- data/shen/release/k_lambda/sys.kl +271 -271
- data/shen/release/k_lambda/t-star.kl +139 -139
- data/shen/release/k_lambda/toplevel.kl +135 -135
- data/shen/release/k_lambda/track.kl +103 -103
- data/shen/release/k_lambda/types.kl +324 -324
- data/shen/release/k_lambda/writer.kl +105 -105
- data/shen/release/k_lambda/yacc.kl +113 -113
- data/shen/release/test_programs/Chap13/problems.txt +26 -26
- data/shen/release/test_programs/README.shen +52 -52
- data/shen/release/test_programs/TinyLispFunctions.txt +15 -15
- data/shen/release/test_programs/TinyTypes.shen +55 -55
- data/shen/release/test_programs/binary.shen +24 -24
- data/shen/release/test_programs/bubble_version_1.shen +28 -28
- data/shen/release/test_programs/bubble_version_2.shen +22 -22
- data/shen/release/test_programs/calculator.shen +21 -21
- data/shen/release/test_programs/cartprod.shen +23 -23
- data/shen/release/test_programs/change.shen +25 -25
- data/shen/release/test_programs/classes-defaults.shen +94 -94
- data/shen/release/test_programs/classes-inheritance.shen +100 -100
- data/shen/release/test_programs/classes-typed.shen +74 -74
- data/shen/release/test_programs/classes-untyped.shen +46 -46
- data/shen/release/test_programs/depth_.shen +14 -14
- data/shen/release/test_programs/einstein.shen +34 -34
- data/shen/release/test_programs/fruit_machine.shen +46 -46
- data/shen/release/test_programs/interpreter.shen +217 -217
- data/shen/release/test_programs/metaprog.shen +85 -85
- data/shen/release/test_programs/minim.shen +192 -192
- data/shen/release/test_programs/mutual.shen +11 -11
- data/shen/release/test_programs/n_queens.shen +45 -45
- data/shen/release/test_programs/newton_version_1.shen +33 -33
- data/shen/release/test_programs/newton_version_2.shen +24 -24
- data/shen/release/test_programs/parse.prl +14 -14
- data/shen/release/test_programs/parser.shen +51 -51
- data/shen/release/test_programs/powerset.shen +10 -10
- data/shen/release/test_programs/prime.shen +10 -10
- data/shen/release/test_programs/prolog.shen +78 -78
- data/shen/release/test_programs/proof_assistant.shen +80 -80
- data/shen/release/test_programs/proplog_version_1.shen +25 -25
- data/shen/release/test_programs/proplog_version_2.shen +27 -27
- data/shen/release/test_programs/qmachine.shen +66 -66
- data/shen/release/test_programs/red-black.shen +54 -54
- data/shen/release/test_programs/search.shen +55 -55
- data/shen/release/test_programs/semantic_net.shen +44 -44
- data/shen/release/test_programs/spreadsheet.shen +34 -34
- data/shen/release/test_programs/stack.shen +27 -27
- data/shen/release/test_programs/streams.shen +20 -20
- data/shen/release/test_programs/strings.shen +57 -57
- data/shen/release/test_programs/structures-typed.shen +71 -71
- data/shen/release/test_programs/structures-untyped.shen +41 -41
- data/shen/release/test_programs/tests.shen +232 -232
- data/shen/release/test_programs/types.shen +11 -11
- data/shen/release/test_programs/whist.shen +239 -239
- data/shen/release/test_programs/yacc.shen +132 -132
- data/spec/shen_ruby/converters_spec.rb +48 -0
- data/spec/spec_helper.rb +1 -2
- metadata +55 -60
- data/k_lambda_spec/atom_spec.rb +0 -85
- data/k_lambda_spec/primitives/arithmetic_spec.rb +0 -175
- data/k_lambda_spec/primitives/assignments_spec.rb +0 -44
- data/k_lambda_spec/primitives/boolean_operations_spec.rb +0 -136
- data/k_lambda_spec/primitives/generic_functions_spec.rb +0 -120
- data/k_lambda_spec/primitives/lists_spec.rb +0 -40
- data/k_lambda_spec/primitives/strings_spec.rb +0 -77
- data/k_lambda_spec/primitives/symbols_spec.rb +0 -24
- data/k_lambda_spec/primitives/vectors_spec.rb +0 -92
- data/k_lambda_spec/spec_helper.rb +0 -29
- data/k_lambda_spec/support/shared_examples.rb +0 -124
- data/k_lambda_spec/tail_recursion_spec.rb +0 -30
- data/lib/kl.rb +0 -7
- data/lib/kl/absvector.rb +0 -12
- data/lib/kl/compiler.rb +0 -360
- data/lib/kl/cons.rb +0 -51
- data/lib/kl/empty_list.rb +0 -12
- data/lib/kl/environment.rb +0 -163
- data/lib/kl/error.rb +0 -4
- data/lib/kl/internal_error.rb +0 -7
- data/lib/kl/lexer.rb +0 -186
- data/lib/kl/primitives/arithmetic.rb +0 -60
- data/lib/kl/primitives/assignments.rb +0 -15
- data/lib/kl/primitives/booleans.rb +0 -21
- data/lib/kl/primitives/error_handling.rb +0 -13
- data/lib/kl/primitives/extensions.rb +0 -12
- data/lib/kl/primitives/generic_functions.rb +0 -29
- data/lib/kl/primitives/lists.rb +0 -23
- data/lib/kl/primitives/streams.rb +0 -28
- data/lib/kl/primitives/strings.rb +0 -63
- data/lib/kl/primitives/symbols.rb +0 -18
- data/lib/kl/primitives/time.rb +0 -17
- data/lib/kl/primitives/vectors.rb +0 -36
- data/lib/kl/reader.rb +0 -46
- data/spec/kl/cons_spec.rb +0 -12
- data/spec/kl/environment_spec.rb +0 -282
- data/spec/kl/interop_spec.rb +0 -68
- data/spec/kl/lexer_spec.rb +0 -149
- data/spec/kl/primitives/generic_functions_spec.rb +0 -29
- data/spec/kl/primitives/symbols_spec.rb +0 -21
- 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
|
|