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,53 +1,53 @@
|
|
1
|
-
\*
|
2
|
-
|
3
|
-
This is the test harness for Shen. Assuming your port to Blub is in the directory Platforms/Blub; do the
|
4
|
-
following.
|
5
|
-
|
6
|
-
(cd "../../Test Programs")
|
7
|
-
(load "README.shen")
|
8
|
-
(load "tests.shen")
|
9
|
-
|
10
|
-
*\
|
11
|
-
|
12
|
-
(package test-harness [report reset ok passed failed]
|
13
|
-
|
14
|
-
(define reset
|
15
|
-
-> (set *passed* (set *failed* 0)))
|
16
|
-
|
17
|
-
(defmacro exec-macro
|
18
|
-
[exec Name Expr Prediction] -> [trap-error [let (protect Output) [output "~%~A: ~R = ~S" Name (rcons Expr) Prediction]
|
19
|
-
(protect Result) [time Expr]
|
20
|
-
[if [= (protect Result) Prediction] [passed] [failed (protect Result)]]]
|
21
|
-
[/. (protect E) [err (protect E)]]])
|
22
|
-
|
23
|
-
(define rcons
|
24
|
-
[X | Y] -> [cons (rcons X) (rcons Y)]
|
25
|
-
X -> X)
|
26
|
-
|
27
|
-
(define passed
|
28
|
-
-> (do (trap-error (set *passed* (+ 1 (value *passed*))) (/. E (set *passed* 1)))
|
29
|
-
(print passed)))
|
30
|
-
|
31
|
-
(define failed
|
32
|
-
Result -> (let Fail+ (trap-error (set *failed* (+ 1 (value *failed*))) (/. E (set *failed* 1)))
|
33
|
-
ShowResult (output "~S returned~%" Result)
|
34
|
-
(if (y-or-n? "failed; continue?") ok (error "kill"))))
|
35
|
-
|
36
|
-
(define err
|
37
|
-
E -> (error "") where (= (error-to-string E) "kill")
|
38
|
-
E -> (do (trap-error (set *failed* (+ 1 (value *failed*))) (/. E (set *failed* 1)))
|
39
|
-
(output "~%failed with error ~A~%" (error-to-string E))))
|
40
|
-
|
41
|
-
(defmacro report-results-macro
|
42
|
-
[report Name | Tests] -> (let NewTests (create-tests Name Tests)
|
43
|
-
[do | NewTests]))
|
44
|
-
|
45
|
-
(define create-tests
|
46
|
-
Name [] -> [[results] ok]
|
47
|
-
Name [Test Prediction | Tests] -> [[exec Name Test Prediction] | (create-tests Name Tests)])
|
48
|
-
|
49
|
-
(define results
|
50
|
-
-> (let Passed (trap-error (value *passed*) (/. E 0))
|
51
|
-
Failed (trap-error (value *failed*) (/. E 0))
|
52
|
-
Percent (* (/ Passed (+ Passed Failed)) 100)
|
1
|
+
\*
|
2
|
+
|
3
|
+
This is the test harness for Shen. Assuming your port to Blub is in the directory Platforms/Blub; do the
|
4
|
+
following.
|
5
|
+
|
6
|
+
(cd "../../Test Programs")
|
7
|
+
(load "README.shen")
|
8
|
+
(load "tests.shen")
|
9
|
+
|
10
|
+
*\
|
11
|
+
|
12
|
+
(package test-harness [report reset ok passed failed]
|
13
|
+
|
14
|
+
(define reset
|
15
|
+
-> (set *passed* (set *failed* 0)))
|
16
|
+
|
17
|
+
(defmacro exec-macro
|
18
|
+
[exec Name Expr Prediction] -> [trap-error [let (protect Output) [output "~%~A: ~R = ~S" Name (rcons Expr) Prediction]
|
19
|
+
(protect Result) [time Expr]
|
20
|
+
[if [= (protect Result) Prediction] [passed] [failed (protect Result)]]]
|
21
|
+
[/. (protect E) [err (protect E)]]])
|
22
|
+
|
23
|
+
(define rcons
|
24
|
+
[X | Y] -> [cons (rcons X) (rcons Y)]
|
25
|
+
X -> X)
|
26
|
+
|
27
|
+
(define passed
|
28
|
+
-> (do (trap-error (set *passed* (+ 1 (value *passed*))) (/. E (set *passed* 1)))
|
29
|
+
(print passed)))
|
30
|
+
|
31
|
+
(define failed
|
32
|
+
Result -> (let Fail+ (trap-error (set *failed* (+ 1 (value *failed*))) (/. E (set *failed* 1)))
|
33
|
+
ShowResult (output "~S returned~%" Result)
|
34
|
+
(if (y-or-n? "failed; continue?") ok (error "kill"))))
|
35
|
+
|
36
|
+
(define err
|
37
|
+
E -> (error "") where (= (error-to-string E) "kill")
|
38
|
+
E -> (do (trap-error (set *failed* (+ 1 (value *failed*))) (/. E (set *failed* 1)))
|
39
|
+
(output "~%failed with error ~A~%" (error-to-string E))))
|
40
|
+
|
41
|
+
(defmacro report-results-macro
|
42
|
+
[report Name | Tests] -> (let NewTests (create-tests Name Tests)
|
43
|
+
[do | NewTests]))
|
44
|
+
|
45
|
+
(define create-tests
|
46
|
+
Name [] -> [[results] ok]
|
47
|
+
Name [Test Prediction | Tests] -> [[exec Name Test Prediction] | (create-tests Name Tests)])
|
48
|
+
|
49
|
+
(define results
|
50
|
+
-> (let Passed (trap-error (value *passed*) (/. E 0))
|
51
|
+
Failed (trap-error (value *failed*) (/. E 0))
|
52
|
+
Percent (* (/ Passed (+ Passed Failed)) 100)
|
53
53
|
(output "~%passed ... ~A~%failed ...~A~%pass rate ...~A%~%~%" Passed Failed Percent))) )
|
@@ -1,16 +1,16 @@
|
|
1
|
-
(defun plus (x y)
|
2
|
-
(lispif (equal x 0)
|
3
|
-
y
|
4
|
-
(plus (prec x) (succ y))))
|
5
|
-
|
6
|
-
(defun member (x y)
|
7
|
-
(lispif (equal y (empty!))
|
8
|
-
(empty!)
|
9
|
-
(lispif (equal x (car y))
|
10
|
-
y
|
11
|
-
(member x (cdr y)))))
|
12
|
-
|
13
|
-
(defun join (x y)
|
14
|
-
(lispif (equal x (empty!))
|
15
|
-
y
|
1
|
+
(defun plus (x y)
|
2
|
+
(lispif (equal x 0)
|
3
|
+
y
|
4
|
+
(plus (prec x) (succ y))))
|
5
|
+
|
6
|
+
(defun member (x y)
|
7
|
+
(lispif (equal y (empty!))
|
8
|
+
(empty!)
|
9
|
+
(lispif (equal x (car y))
|
10
|
+
y
|
11
|
+
(member x (cdr y)))))
|
12
|
+
|
13
|
+
(defun join (x y)
|
14
|
+
(lispif (equal x (empty!))
|
15
|
+
y
|
16
16
|
(lispcons (car x) (join (cdr x) y))))
|
@@ -1,55 +1,55 @@
|
|
1
|
-
(specialise defun)
|
2
|
-
(specialise lambda')
|
3
|
-
|
4
|
-
(datatype tiny_lisp_type_theory
|
5
|
-
|
6
|
-
let Lambda (mk_lambda Xs Body)
|
7
|
-
F : A >> Lambda : A;
|
8
|
-
__________________
|
9
|
-
(defun F Xs Body) : A;
|
10
|
-
|
11
|
-
let X* (gensym &&x)
|
12
|
-
let Y* (subst X* X Y)
|
13
|
-
X* : A >> Y* : B;
|
14
|
-
_____________________
|
15
|
-
(lambda' (X) Y) : (A --> B);
|
16
|
-
|
17
|
-
F : (A --> B); X : A;
|
18
|
-
________________
|
19
|
-
(F X) : B;
|
20
|
-
|
21
|
-
____________________________
|
22
|
-
lispif : (bool --> (A --> (A --> A)));
|
23
|
-
|
24
|
-
________________________
|
25
|
-
equal : (A --> (A --> bool));
|
26
|
-
|
27
|
-
___________________________
|
28
|
-
lispcons : (A --> ((list A) --> (list A)));
|
29
|
-
|
30
|
-
______________
|
31
|
-
car : ((list A) --> A);
|
32
|
-
|
33
|
-
_______________
|
34
|
-
cdr : ((list A) --> (list A));
|
35
|
-
|
36
|
-
if (element? F [succ prec])
|
37
|
-
____________________
|
38
|
-
F : (number --> number);
|
39
|
-
|
40
|
-
___________
|
41
|
-
(tee!) : bool;
|
42
|
-
|
43
|
-
____________
|
44
|
-
(empty!) : (list A);
|
45
|
-
|
46
|
-
________
|
47
|
-
(empty!) : bool;
|
48
|
-
|
49
|
-
if (symbol? X)
|
50
|
-
____________
|
51
|
-
(quote X) : symbol;)
|
52
|
-
|
53
|
-
(define mk_lambda
|
54
|
-
[X] Body -> [lambda' [X] Body]
|
55
|
-
[X | Y] Body -> [lambda' [X] (mk_lambda Y Body)])
|
1
|
+
(specialise defun)
|
2
|
+
(specialise lambda')
|
3
|
+
|
4
|
+
(datatype tiny_lisp_type_theory
|
5
|
+
|
6
|
+
let Lambda (mk_lambda Xs Body)
|
7
|
+
F : A >> Lambda : A;
|
8
|
+
__________________
|
9
|
+
(defun F Xs Body) : A;
|
10
|
+
|
11
|
+
let X* (gensym &&x)
|
12
|
+
let Y* (subst X* X Y)
|
13
|
+
X* : A >> Y* : B;
|
14
|
+
_____________________
|
15
|
+
(lambda' (X) Y) : (A --> B);
|
16
|
+
|
17
|
+
F : (A --> B); X : A;
|
18
|
+
________________
|
19
|
+
(F X) : B;
|
20
|
+
|
21
|
+
____________________________
|
22
|
+
lispif : (bool --> (A --> (A --> A)));
|
23
|
+
|
24
|
+
________________________
|
25
|
+
equal : (A --> (A --> bool));
|
26
|
+
|
27
|
+
___________________________
|
28
|
+
lispcons : (A --> ((list A) --> (list A)));
|
29
|
+
|
30
|
+
______________
|
31
|
+
car : ((list A) --> A);
|
32
|
+
|
33
|
+
_______________
|
34
|
+
cdr : ((list A) --> (list A));
|
35
|
+
|
36
|
+
if (element? F [succ prec])
|
37
|
+
____________________
|
38
|
+
F : (number --> number);
|
39
|
+
|
40
|
+
___________
|
41
|
+
(tee!) : bool;
|
42
|
+
|
43
|
+
____________
|
44
|
+
(empty!) : (list A);
|
45
|
+
|
46
|
+
________
|
47
|
+
(empty!) : bool;
|
48
|
+
|
49
|
+
if (symbol? X)
|
50
|
+
____________
|
51
|
+
(quote X) : symbol;)
|
52
|
+
|
53
|
+
(define mk_lambda
|
54
|
+
[X] Body -> [lambda' [X] Body]
|
55
|
+
[X | Y] Body -> [lambda' [X] (mk_lambda Y Body)])
|
@@ -1,24 +1,24 @@
|
|
1
|
-
(datatype binary
|
2
|
-
|
3
|
-
if (element? X [0 1])
|
4
|
-
_____________
|
5
|
-
X : zero-or-one;
|
6
|
-
|
7
|
-
X : zero-or-one;
|
8
|
-
________________
|
9
|
-
[X] : binary;
|
10
|
-
|
11
|
-
X : zero-or-one; Y : binary;
|
12
|
-
____________________________
|
13
|
-
[X | Y] : binary;
|
14
|
-
|
15
|
-
X : zero-or-one, [Y | Z] : binary >> P;
|
16
|
-
________________________________________
|
17
|
-
[X Y | Z] : binary >> P;)
|
18
|
-
|
19
|
-
(define complement
|
20
|
-
{binary --> binary}
|
21
|
-
[0] -> [1]
|
22
|
-
[1] -> [0]
|
23
|
-
[1 N | X] -> [0 | (complement [N | X])]
|
24
|
-
[0 N | X] -> [1 | (complement [N | X])])
|
1
|
+
(datatype binary
|
2
|
+
|
3
|
+
if (element? X [0 1])
|
4
|
+
_____________
|
5
|
+
X : zero-or-one;
|
6
|
+
|
7
|
+
X : zero-or-one;
|
8
|
+
________________
|
9
|
+
[X] : binary;
|
10
|
+
|
11
|
+
X : zero-or-one; Y : binary;
|
12
|
+
____________________________
|
13
|
+
[X | Y] : binary;
|
14
|
+
|
15
|
+
X : zero-or-one, [Y | Z] : binary >> P;
|
16
|
+
________________________________________
|
17
|
+
[X Y | Z] : binary >> P;)
|
18
|
+
|
19
|
+
(define complement
|
20
|
+
{binary --> binary}
|
21
|
+
[0] -> [1]
|
22
|
+
[1] -> [0]
|
23
|
+
[1 N | X] -> [0 | (complement [N | X])]
|
24
|
+
[0 N | X] -> [1 | (complement [N | X])])
|
@@ -1,28 +1,28 @@
|
|
1
|
-
(define bubble-sort
|
2
|
-
\* bubble again if you need to *\
|
3
|
-
X -> (bubble-again-perhaps (bubble X) X))
|
4
|
-
|
5
|
-
(define bubble
|
6
|
-
[] -> []
|
7
|
-
[X] -> [X]
|
8
|
-
[X Y | Z] -> [Y | (bubble [X | Z])] where (> Y X)
|
9
|
-
[X Y | Z] -> [X | (bubble [Y | Z])])
|
10
|
-
|
11
|
-
(define bubble-again-perhaps
|
12
|
-
\* no change as a result of bubbling - then the job is done *\
|
13
|
-
X X -> X
|
14
|
-
\* else bubble again *\
|
15
|
-
X _ -> (bubble-sort X))
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
1
|
+
(define bubble-sort
|
2
|
+
\* bubble again if you need to *\
|
3
|
+
X -> (bubble-again-perhaps (bubble X) X))
|
4
|
+
|
5
|
+
(define bubble
|
6
|
+
[] -> []
|
7
|
+
[X] -> [X]
|
8
|
+
[X Y | Z] -> [Y | (bubble [X | Z])] where (> Y X)
|
9
|
+
[X Y | Z] -> [X | (bubble [Y | Z])])
|
10
|
+
|
11
|
+
(define bubble-again-perhaps
|
12
|
+
\* no change as a result of bubbling - then the job is done *\
|
13
|
+
X X -> X
|
14
|
+
\* else bubble again *\
|
15
|
+
X _ -> (bubble-sort X))
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
@@ -1,22 +1,22 @@
|
|
1
|
-
(define bubble-sort
|
2
|
-
X -> (fix bubble X))
|
3
|
-
|
4
|
-
(define bubble
|
5
|
-
[] -> []
|
6
|
-
[X] -> [X]
|
7
|
-
[X Y | Z] -> [Y | (bubble [X | Z])] where (> Y X)
|
8
|
-
[X Y | Z] -> [X | (bubble [Y | Z])])
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
1
|
+
(define bubble-sort
|
2
|
+
X -> (fix bubble X))
|
3
|
+
|
4
|
+
(define bubble
|
5
|
+
[] -> []
|
6
|
+
[X] -> [X]
|
7
|
+
[X Y | Z] -> [Y | (bubble [X | Z])] where (> Y X)
|
8
|
+
[X Y | Z] -> [X | (bubble [Y | Z])])
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
@@ -1,21 +1,21 @@
|
|
1
|
-
(datatype arith-expr
|
2
|
-
|
3
|
-
X : number;
|
4
|
-
====================
|
5
|
-
[num X] : arith-expr;
|
6
|
-
|
7
|
-
if (element? Op [+ - * /])
|
8
|
-
X : arith-expr; Y : arith-expr;
|
9
|
-
===============================
|
10
|
-
[X Op Y] : arith-expr;)
|
11
|
-
|
12
|
-
(define do-calculation
|
13
|
-
{arith-expr --> number}
|
14
|
-
[X + Y] -> (+ (do-calculation X) (do-calculation Y))
|
15
|
-
[X - Y] -> (- (do-calculation X) (do-calculation Y))
|
16
|
-
[X * Y] -> (* (do-calculation X) (do-calculation Y))
|
17
|
-
[X / Y] -> (/ (do-calculation X) (do-calculation Y))
|
18
|
-
[num X] -> X)
|
19
|
-
|
20
|
-
|
21
|
-
|
1
|
+
(datatype arith-expr
|
2
|
+
|
3
|
+
X : number;
|
4
|
+
====================
|
5
|
+
[num X] : arith-expr;
|
6
|
+
|
7
|
+
if (element? Op [+ - * /])
|
8
|
+
X : arith-expr; Y : arith-expr;
|
9
|
+
===============================
|
10
|
+
[X Op Y] : arith-expr;)
|
11
|
+
|
12
|
+
(define do-calculation
|
13
|
+
{arith-expr --> number}
|
14
|
+
[X + Y] -> (+ (do-calculation X) (do-calculation Y))
|
15
|
+
[X - Y] -> (- (do-calculation X) (do-calculation Y))
|
16
|
+
[X * Y] -> (* (do-calculation X) (do-calculation Y))
|
17
|
+
[X / Y] -> (/ (do-calculation X) (do-calculation Y))
|
18
|
+
[num X] -> X)
|
19
|
+
|
20
|
+
|
21
|
+
|
@@ -1,23 +1,23 @@
|
|
1
|
-
(define cartesian-product
|
2
|
-
[ ] _ -> [ ]
|
3
|
-
[X | Y] Z -> (append (all-pairs-using-X X Z) (cartesian-product Y Z)))
|
4
|
-
|
5
|
-
(define all-pairs-using-X
|
6
|
-
_ [ ] -> [ ]
|
7
|
-
X [Y | Z] -> [[X Y] | (all-pairs-using-X X Z)])
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
1
|
+
(define cartesian-product
|
2
|
+
[ ] _ -> [ ]
|
3
|
+
[X | Y] Z -> (append (all-pairs-using-X X Z) (cartesian-product Y Z)))
|
4
|
+
|
5
|
+
(define all-pairs-using-X
|
6
|
+
_ [ ] -> [ ]
|
7
|
+
X [Y | Z] -> [[X Y] | (all-pairs-using-X X Z)])
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|