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.
- 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
|
|