shen-ruby 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.rspec +0 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +20 -0
- data/MIT_LICENSE.txt +26 -0
- data/README.md +94 -0
- data/bin/shen_test_suite.rb +9 -0
- data/bin/srrepl +23 -0
- data/lib/kl.rb +7 -0
- data/lib/kl/absvector.rb +12 -0
- data/lib/kl/compiler.rb +253 -0
- data/lib/kl/cons.rb +51 -0
- data/lib/kl/empty_list.rb +12 -0
- data/lib/kl/environment.rb +123 -0
- data/lib/kl/error.rb +4 -0
- data/lib/kl/internal_error.rb +7 -0
- data/lib/kl/lexer.rb +186 -0
- data/lib/kl/primitives/arithmetic.rb +60 -0
- data/lib/kl/primitives/assignments.rb +18 -0
- data/lib/kl/primitives/booleans.rb +17 -0
- data/lib/kl/primitives/error_handling.rb +13 -0
- data/lib/kl/primitives/generic_functions.rb +22 -0
- data/lib/kl/primitives/lists.rb +21 -0
- data/lib/kl/primitives/streams.rb +38 -0
- data/lib/kl/primitives/strings.rb +55 -0
- data/lib/kl/primitives/symbols.rb +17 -0
- data/lib/kl/primitives/time.rb +17 -0
- data/lib/kl/primitives/vectors.rb +30 -0
- data/lib/kl/reader.rb +40 -0
- data/lib/kl/trampoline.rb +14 -0
- data/lib/shen_ruby.rb +7 -0
- data/lib/shen_ruby/version.rb +3 -0
- data/shen-ruby.gemspec +26 -0
- data/shen/README.txt +17 -0
- data/shen/lib/shen_ruby/shen.rb +124 -0
- data/shen/license.txt +34 -0
- data/shen/release/benchmarks/N_queens.shen +45 -0
- data/shen/release/benchmarks/README.shen +14 -0
- data/shen/release/benchmarks/benchmarks.shen +56 -0
- data/shen/release/benchmarks/bigprog +2173 -0
- data/shen/release/benchmarks/br.shen +13 -0
- data/shen/release/benchmarks/einstein.shen +33 -0
- data/shen/release/benchmarks/heatwave.gif +0 -0
- data/shen/release/benchmarks/interpreter.shen +219 -0
- data/shen/release/benchmarks/picture.jpg +0 -0
- data/shen/release/benchmarks/plato.jpg +0 -0
- data/shen/release/benchmarks/powerset.shen +10 -0
- data/shen/release/benchmarks/prime.shen +10 -0
- data/shen/release/benchmarks/short.shen +129 -0
- data/shen/release/benchmarks/text.txt +68 -0
- data/shen/release/k_lambda/core.kl +1002 -0
- data/shen/release/k_lambda/declarations.kl +1021 -0
- data/shen/release/k_lambda/load.kl +94 -0
- data/shen/release/k_lambda/macros.kl +479 -0
- data/shen/release/k_lambda/prolog.kl +1309 -0
- data/shen/release/k_lambda/reader.kl +1058 -0
- data/shen/release/k_lambda/sequent.kl +556 -0
- data/shen/release/k_lambda/sys.kl +582 -0
- data/shen/release/k_lambda/t-star.kl +3493 -0
- data/shen/release/k_lambda/toplevel.kl +223 -0
- data/shen/release/k_lambda/track.kl +208 -0
- data/shen/release/k_lambda/types.kl +455 -0
- data/shen/release/k_lambda/writer.kl +108 -0
- data/shen/release/k_lambda/yacc.kl +280 -0
- data/shen/release/test_programs/Chap13/problems.txt +26 -0
- data/shen/release/test_programs/README.shen +53 -0
- data/shen/release/test_programs/TinyLispFunctions.txt +16 -0
- data/shen/release/test_programs/TinyTypes.shen +55 -0
- data/shen/release/test_programs/binary.shen +24 -0
- data/shen/release/test_programs/bubble_version_1.shen +28 -0
- data/shen/release/test_programs/bubble_version_2.shen +22 -0
- data/shen/release/test_programs/calculator.shen +21 -0
- data/shen/release/test_programs/cartprod.shen +23 -0
- data/shen/release/test_programs/change.shen +25 -0
- data/shen/release/test_programs/classes-defaults.shen +94 -0
- data/shen/release/test_programs/classes-inheritance.shen +100 -0
- data/shen/release/test_programs/classes-typed.shen +74 -0
- data/shen/release/test_programs/classes-untyped.shen +46 -0
- data/shen/release/test_programs/depth_.shen +14 -0
- data/shen/release/test_programs/einstein.shen +33 -0
- data/shen/release/test_programs/fruit_machine.shen +46 -0
- data/shen/release/test_programs/interpreter.shen +219 -0
- data/shen/release/test_programs/metaprog.shen +85 -0
- data/shen/release/test_programs/minim.shen +193 -0
- data/shen/release/test_programs/mutual.shen +11 -0
- data/shen/release/test_programs/n_queens.shen +45 -0
- data/shen/release/test_programs/newton_version_1.shen +33 -0
- data/shen/release/test_programs/newton_version_2.shen +24 -0
- data/shen/release/test_programs/parse.prl +14 -0
- data/shen/release/test_programs/parser.shen +52 -0
- data/shen/release/test_programs/powerset.shen +10 -0
- data/shen/release/test_programs/prime.shen +10 -0
- data/shen/release/test_programs/proof_assistant.shen +81 -0
- data/shen/release/test_programs/proplog_version_1.shen +25 -0
- data/shen/release/test_programs/proplog_version_2.shen +27 -0
- data/shen/release/test_programs/qmachine.shen +67 -0
- data/shen/release/test_programs/red-black.shen +55 -0
- data/shen/release/test_programs/search.shen +56 -0
- data/shen/release/test_programs/semantic_net.shen +44 -0
- data/shen/release/test_programs/spreadsheet.shen +35 -0
- data/shen/release/test_programs/stack.shen +27 -0
- data/shen/release/test_programs/streams.shen +20 -0
- data/shen/release/test_programs/strings.shen +59 -0
- data/shen/release/test_programs/structures-typed.shen +71 -0
- data/shen/release/test_programs/structures-untyped.shen +42 -0
- data/shen/release/test_programs/tests.shen +294 -0
- data/shen/release/test_programs/types.shen +11 -0
- data/shen/release/test_programs/whist.shen +240 -0
- data/shen/release/test_programs/yacc.shen +136 -0
- data/spec/kl/cons_spec.rb +12 -0
- data/spec/kl/environment_spec.rb +306 -0
- data/spec/kl/lexer_spec.rb +149 -0
- data/spec/kl/primitives/generic_functions_spec.rb +29 -0
- data/spec/kl/primitives/symbols_spec.rb +21 -0
- data/spec/kl/reader_spec.rb +36 -0
- data/spec/spec_helper.rb +2 -0
- metadata +189 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
(define backchain
|
2
|
+
Conc Assumptions -> (backchain* [Conc] Assumptions Assumptions))
|
3
|
+
|
4
|
+
(define backchain*
|
5
|
+
[] _ _ -> proved
|
6
|
+
[[P & Q] | Goals] _ Assumptions
|
7
|
+
-> (backchain* [P Q | Goals] Assumptions Assumptions)
|
8
|
+
[P | Goals] [[P <= | Subgoal] | _] Assumptions
|
9
|
+
<- (backchain* (append Subgoal Goals) Assumptions Assumptions)
|
10
|
+
Goals [_ | Rest] Assumptions -> (backchain* Goals Rest Assumptions)
|
11
|
+
_ _ _ -> (fail))
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
(define backchain
|
2
|
+
Conc Assumptions -> (backchain* Conc Assumptions Assumptions))
|
3
|
+
|
4
|
+
(define backchain*
|
5
|
+
P [P | _] _ -> true
|
6
|
+
[P & Q] _ Assumptions
|
7
|
+
-> (and (backchain* P Assumptions Assumptions)
|
8
|
+
(backchain* Q Assumptions Assumptions))
|
9
|
+
P [[P <= Q] | _] Assumptions
|
10
|
+
<- (fail-if (/. X (= X false)) (backchain* Q Assumptions Assumptions))
|
11
|
+
P [_ | Rest] Assumptions -> (backchain* P Rest Assumptions)
|
12
|
+
_ _ _ -> false)
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
@@ -0,0 +1,67 @@
|
|
1
|
+
(datatype progression
|
2
|
+
|
3
|
+
X : A; S : (A --> A); E : (A --> boolean);
|
4
|
+
==========================================
|
5
|
+
[X S E] : (progression A);)
|
6
|
+
|
7
|
+
(define force
|
8
|
+
{(progression A) --> A}
|
9
|
+
[X S E] -> X)
|
10
|
+
|
11
|
+
(define delay
|
12
|
+
{(progression A) --> (progression A)}
|
13
|
+
[X S E] -> [(S X) S E])
|
14
|
+
|
15
|
+
(define end?
|
16
|
+
{(progression A) --> boolean}
|
17
|
+
[X S E] -> (E X))
|
18
|
+
|
19
|
+
(define push
|
20
|
+
{A --> (progression A) --> (progression A)}
|
21
|
+
X [Y S E] -> [X (/. Z (if (= Z X) Y (S Z))) E])
|
22
|
+
|
23
|
+
(define forall
|
24
|
+
{(progression A) --> (A --> boolean) --> boolean}
|
25
|
+
[X S E] P -> (if (E X) true (and (P X) (forall [(S X) S E] P))))
|
26
|
+
|
27
|
+
(define exists
|
28
|
+
{(progression A) --> (A --> boolean) --> boolean}
|
29
|
+
[X S E] P -> (if (E X) false (or (P X) (exists [(S X) S E] P))))
|
30
|
+
|
31
|
+
(define super
|
32
|
+
{(progression A) --> (A --> B) --> (B --> C --> C) --> C --> C}
|
33
|
+
[X S E] P F Y -> (if (E X) Y (F (P X) (super [(S X) S E] P F Y))))
|
34
|
+
|
35
|
+
(define forall
|
36
|
+
{(progression A) --> (A --> boolean) --> boolean}
|
37
|
+
Progression P -> (super Progression P and true))
|
38
|
+
|
39
|
+
(define exists
|
40
|
+
{(progression A) --> (A --> boolean) --> boolean}
|
41
|
+
Progression P -> (super Progression P or false))
|
42
|
+
|
43
|
+
(define for
|
44
|
+
{(progression A) --> (A --> B) --> number}
|
45
|
+
Progression P -> (super Progression P progn 0))
|
46
|
+
|
47
|
+
(define progn
|
48
|
+
{A --> B --> B}
|
49
|
+
X Y -> Y)
|
50
|
+
|
51
|
+
(define filter
|
52
|
+
{(progression A) --> (A --> boolean) --> (list A)}
|
53
|
+
Progression P -> (super Progression (/. X (if (P X) [X] [])) append []))
|
54
|
+
|
55
|
+
(define next-prime
|
56
|
+
{number --> number}
|
57
|
+
N -> (if (prime? (+ N 1)) (+ N 1) (next-prime (+ N 1))))
|
58
|
+
|
59
|
+
(define prime?
|
60
|
+
{number --> boolean}
|
61
|
+
X -> (prime-help X (/ X 2) 2))
|
62
|
+
|
63
|
+
(define prime-help
|
64
|
+
{number --> number --> number --> boolean}
|
65
|
+
X Max Div -> false where (integer? (/ X Div))
|
66
|
+
X Max Div -> true where (> Div Max)
|
67
|
+
X Max Div -> (prime-help X Max (+ 1 Div)))
|
@@ -0,0 +1,55 @@
|
|
1
|
+
\**\ \* Copyright (c) 2011, Justin Grant <justin at imagine27 dot com> *\ \* All rights reserved. *\ \**\ \* Redistribution and use in source and binary forms, with or without modification, *\ \* are permitted provided that the following conditions are met: *\ \**\ \* Redistributions of source code must retain the above copyright notice, this list *\ \* of conditions and the following disclaimer. *\ \* Redistributions in binary form must reproduce the above copyright notice, this *\ \* list of conditions and the following disclaimer in the documentation and/or *\ \* other materials provided with the distribution. *\ \* Neither the name of the <ORGANIZATION> nor the names of its contributors may be *\ \* used to endorse or promote products derived from this software without specific *\ \* prior written permission. *\ \**\ \* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *\ \* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *\ \* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *\ \* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR *\ \* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES *\ \* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *\ \* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY *\ \* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *\ \* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, *\ \* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *\ \**\ (datatype tree-node
|
2
|
+
|
3
|
+
Key : number; Val : B;
|
4
|
+
======================
|
5
|
+
[Key Val] : tree-node;)
|
6
|
+
|
7
|
+
(datatype color
|
8
|
+
|
9
|
+
if (element? Color [red black])
|
10
|
+
_______________________________
|
11
|
+
Color : color;)
|
12
|
+
|
13
|
+
(datatype tree
|
14
|
+
|
15
|
+
if (empty? Tree)
|
16
|
+
________________
|
17
|
+
Tree : tree;
|
18
|
+
|
19
|
+
Color : color; LTree : tree; TreeNode : tree-node; RTree : tree;
|
20
|
+
================================================================
|
21
|
+
[Color LTree TreeNode RTree] : tree;)
|
22
|
+
|
23
|
+
(define node-key
|
24
|
+
{tree-node --> number}
|
25
|
+
[Key Val] -> Key)
|
26
|
+
|
27
|
+
(define make-tree-black
|
28
|
+
{tree --> tree}
|
29
|
+
[Color A X B] -> [black A X B])
|
30
|
+
|
31
|
+
(define member
|
32
|
+
{tree-node --> tree --> boolean}
|
33
|
+
X [] -> false
|
34
|
+
X [Color A Y B] -> (cases (< (node-key X) (node-key Y)) (member X A)
|
35
|
+
(< (node-key Y) (node-key X)) (member X B)
|
36
|
+
true true))
|
37
|
+
|
38
|
+
(define balance
|
39
|
+
{tree --> tree}
|
40
|
+
[black [red [red A X B] Y C] Z D] -> [red [black A X B] Y [black C Z D]]
|
41
|
+
[black [red A X [red B Y C]] Z D] -> [red [black A X B] Y [black C Z D]]
|
42
|
+
[black A X [red [red B Y C] Z D]] -> [red [black A X B] Y [black C Z D]]
|
43
|
+
[black A X [red B Y [red C Z D]]] -> [red [black A X B] Y [black C Z D]]
|
44
|
+
S -> S)
|
45
|
+
|
46
|
+
(define insert-
|
47
|
+
{tree-node --> tree --> tree}
|
48
|
+
X [] -> [red [] X []]
|
49
|
+
X [Color A Y B] -> (cases (< (node-key X) (node-key Y)) (balance [Color (insert- X A) Y B])
|
50
|
+
(< (node-key Y) (node-key X)) (balance [Color A Y (insert- X B)])
|
51
|
+
true [Color A Y B]))
|
52
|
+
|
53
|
+
(define insert
|
54
|
+
{tree-node --> tree --> tree}
|
55
|
+
X S -> (make-tree-black (insert- X S)))
|
@@ -0,0 +1,56 @@
|
|
1
|
+
(define breadth-first
|
2
|
+
{state --> (state --> (list state)) --> (state --> boolean) --> boolean}
|
3
|
+
Start F Test -> (b* F Test (F Start)))
|
4
|
+
|
5
|
+
(define b*
|
6
|
+
{(state --> (list state)) --> (state --> boolean) --> (list state) --> boolean}
|
7
|
+
F Test States -> true where (some Test States)
|
8
|
+
F Test States -> (let NewStates (mapcan F States)
|
9
|
+
(if (empty? NewStates)
|
10
|
+
false
|
11
|
+
(b* F Test NewStates))))
|
12
|
+
|
13
|
+
(define some
|
14
|
+
{(A --> boolean) --> (list A) --> boolean}
|
15
|
+
Test [] -> false
|
16
|
+
Test [X|Y] -> (or (Test X) (some Test Y)))
|
17
|
+
|
18
|
+
(define depth
|
19
|
+
{state --> (state --> (list state)) --> (state --> boolean) --> boolean}
|
20
|
+
Start _ Test -> true where (Test Start)
|
21
|
+
Start F Test -> (d* F Test (F Start)))
|
22
|
+
|
23
|
+
(define d*
|
24
|
+
{(state --> (list state)) --> (state --> boolean) --> (list state) --> boolean}
|
25
|
+
_ Test [State | _] -> true where (Test State)
|
26
|
+
F Test [State | States] <- (fail-if (= false) (d* F Test (F State)))
|
27
|
+
F Test [_ | States] -> (d* F Test States)
|
28
|
+
_ _ _ -> false)
|
29
|
+
|
30
|
+
(define hill
|
31
|
+
{(state --> number) --> state --> (state --> (list state)) --> (state --> boolean) --> boolean}
|
32
|
+
_ Start _ Test -> true where (Test Start)
|
33
|
+
E Start F Test -> (h* E F Test (order_states E (F Start))))
|
34
|
+
|
35
|
+
(define h*
|
36
|
+
{(state --> number) --> (state --> (list state)) --> (state --> boolean) --> (list state) --> boolean}
|
37
|
+
_ _ Test [State | _] -> true where (Test State)
|
38
|
+
E F Test [State | States]
|
39
|
+
<- (fail-if (/. X (= X false)) (h* E F Test (order_states E (F State))))
|
40
|
+
E F Test [_ | States] -> (h* E F Test States)
|
41
|
+
_ _ _ _ -> false)
|
42
|
+
|
43
|
+
(define order_states
|
44
|
+
{(state --> number) --> (list state) --> (list state)}
|
45
|
+
E States -> (sort (/. S1 (/. S2 (> (E S1) (E S2)))) States))
|
46
|
+
|
47
|
+
(define sort
|
48
|
+
{(A --> (A --> boolean)) --> (list A) --> (list A)}
|
49
|
+
R X -> (fix (/. Y (sort* R Y)) X))
|
50
|
+
|
51
|
+
(define sort*
|
52
|
+
{(A --> A --> boolean) --> (list A) --> (list A)}
|
53
|
+
_ [] -> []
|
54
|
+
_ [X] -> [X]
|
55
|
+
R [X Y | Z] -> [Y | (sort* R [X | Z])] where (R Y X)
|
56
|
+
R [X Y | Z] -> [X | (sort* R [Y | Z])])
|
@@ -0,0 +1,44 @@
|
|
1
|
+
(define query
|
2
|
+
[is Object Concept] -> (if (belongs? Object Concept) yes no))
|
3
|
+
|
4
|
+
(define belongs?
|
5
|
+
Object Concept -> (element? Concept (fix spread-activation [Object])))
|
6
|
+
|
7
|
+
(define spread-activation
|
8
|
+
[] -> []
|
9
|
+
[Vertex | Vertices] -> (union (accessible-from Vertex)
|
10
|
+
(spread-activation Vertices)))
|
11
|
+
|
12
|
+
(define accessible-from
|
13
|
+
Vertex -> [Vertex | (union (is_links Vertex) (type_links Vertex))])
|
14
|
+
|
15
|
+
(define is_links
|
16
|
+
Vertex -> (get-prop Vertex is_a []))
|
17
|
+
|
18
|
+
(define type_links
|
19
|
+
Vertex -> (get-prop Vertex type_of []))
|
20
|
+
|
21
|
+
(define assert
|
22
|
+
[Object is_a Type] -> (put Object is_a [Type | (is_links Object)])
|
23
|
+
[Type1 type_of Type2] -> (put Type1 type_of [Type2 | (type_links Type1)]))
|
24
|
+
|
25
|
+
(define get-prop
|
26
|
+
Ob Pointer Default -> (trap-error (get Ob Pointer) (/. E Default)))
|
27
|
+
|
28
|
+
(define clear
|
29
|
+
Ob -> (put Ob is_a (put Ob type_of [])))
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
(define assess-spreadsheet
|
2
|
+
Spreadsheet -> (map (/. Row (assign-fixed-values Row Spreadsheet))
|
3
|
+
Spreadsheet))
|
4
|
+
|
5
|
+
(define assign-fixed-values
|
6
|
+
[Index | Cells] Spreadsheet
|
7
|
+
-> [Index | (map (/. Cell (assign-cell-value Cell Spreadsheet)) Cells)])
|
8
|
+
|
9
|
+
(define assign-cell-value
|
10
|
+
[Attribute Value] _ -> [Attribute Value] where (fixed-value? Value)
|
11
|
+
[Attribute Value] Spreadsheet -> [Attribute (Value Spreadsheet)])
|
12
|
+
|
13
|
+
(define fixed-value?
|
14
|
+
\* number?, symbol? and string? are system functions - see appendix A *\
|
15
|
+
Value -> (or (number? Value) (or (symbol? Value) (string? Value))))
|
16
|
+
|
17
|
+
(define get'
|
18
|
+
\* spreads the spreadsheet! *\
|
19
|
+
Index Attribute Spreadsheet
|
20
|
+
-> (get-row Index Attribute Spreadsheet Spreadsheet))
|
21
|
+
|
22
|
+
(define get-row
|
23
|
+
\* looks for the right row using the index *\
|
24
|
+
Index Attribute [[Index | Cells] | _] Spreadsheet
|
25
|
+
-> (get-cell Attribute Cells Spreadsheet)
|
26
|
+
Index Attribute [_ | Rows] Spreadsheet
|
27
|
+
-> (get-row Index Attribute Rows Spreadsheet)
|
28
|
+
Index _ _ _ -> (error "Index ~A not found" Index))
|
29
|
+
|
30
|
+
(define get-cell
|
31
|
+
Attribute [[Attribute Value] | _] Spreadsheet
|
32
|
+
-> (if (fixed-value? Value) Value (Value Spreadsheet))
|
33
|
+
Attribute [_ | Cells] Spreadsheet
|
34
|
+
-> (get-cell Attribute Cells Spreadsheet)
|
35
|
+
Attribute _ _ -> (error "Attribute ~A not found" Attribute))
|
@@ -0,0 +1,27 @@
|
|
1
|
+
(declare empty-stack [A --> [stack B]])
|
2
|
+
|
3
|
+
(declare push [A --> [stack A] --> [stack A]])
|
4
|
+
|
5
|
+
(declare top [[stack A] --> A])
|
6
|
+
|
7
|
+
(declare pop [[stack A] --> [stack A]])
|
8
|
+
|
9
|
+
(define empty-stack
|
10
|
+
_ -> (/. X (if (or (= X pop) (= X top))
|
11
|
+
(error "this stack is empty~%")
|
12
|
+
(error "~A is not an operation on stacks.~%" X))))
|
13
|
+
|
14
|
+
(define push
|
15
|
+
X S -> (/. Y (if (= Y pop)
|
16
|
+
S
|
17
|
+
(if (= Y top)
|
18
|
+
X
|
19
|
+
(error "~A is not an operation on stacks.~%" Y)))))
|
20
|
+
|
21
|
+
(define top
|
22
|
+
S -> (S top))
|
23
|
+
|
24
|
+
(define pop
|
25
|
+
S -> (S pop))
|
26
|
+
|
27
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
(datatype progression
|
2
|
+
|
3
|
+
X : (A * (A --> A) * (A --> boolean));
|
4
|
+
======================================
|
5
|
+
X : (progression A);)
|
6
|
+
|
7
|
+
(define delay
|
8
|
+
{(progression A) --> (progression A)}
|
9
|
+
(@p X F E) -> (if (not (E X))
|
10
|
+
(@p (F X) F E)
|
11
|
+
(error "progression exhausted!~%")))
|
12
|
+
|
13
|
+
(define force
|
14
|
+
{(progression A) --> A}
|
15
|
+
(@p X F E) -> X)
|
16
|
+
|
17
|
+
(define end?
|
18
|
+
{(progression A) --> boolean}
|
19
|
+
(@p X _ E) -> (E X))
|
20
|
+
|
@@ -0,0 +1,59 @@
|
|
1
|
+
\* Replace the first occurrence of a string Rem by Rep *\
|
2
|
+
(define subst-string
|
3
|
+
{string --> string --> string --> string}
|
4
|
+
_ _ "" -> ""
|
5
|
+
Rep (@s S Ss) (@s S Ss') <- (fail-if (= "failed!") (subst-string' Rep Ss Ss'))
|
6
|
+
Rep Rem (@s S Ss) -> (@s S (subst-string Rep Rem Ss)))
|
7
|
+
|
8
|
+
(define subst-string'
|
9
|
+
{string --> string --> string --> string}
|
10
|
+
Rep "" Ss -> (@s Rep Ss)
|
11
|
+
Rep (@s S Ss) (@s S Ss') -> (subst-string' Rep Ss Ss')
|
12
|
+
_ _ _ -> "failed!")
|
13
|
+
|
14
|
+
|
15
|
+
(define rwilli
|
16
|
+
{string --> string}
|
17
|
+
"" -> ""
|
18
|
+
(@s "Willi" Ss) -> (rwilli Ss)
|
19
|
+
(@s _ Ss) -> (rwilli Ss))
|
20
|
+
|
21
|
+
|
22
|
+
\* Length of a string. *\
|
23
|
+
(define strlen
|
24
|
+
{string --> number}
|
25
|
+
"" -> 0
|
26
|
+
(@s _ S) -> (+ 1 (strlen S)))
|
27
|
+
|
28
|
+
\* Trim characters from the front of a string. *\
|
29
|
+
(define trim-string-left
|
30
|
+
{(list string) --> string --> string}
|
31
|
+
_ "" -> ""
|
32
|
+
Trim (@s S Ss) -> (@s S Ss) where (not (element? S Trim))
|
33
|
+
Trim (@s _ Ss) -> (trim-string-left Trim Ss))
|
34
|
+
|
35
|
+
\* Trim characters from the end of a string. *\
|
36
|
+
(define trim-string-right
|
37
|
+
{(list string) --> string --> string}
|
38
|
+
Trim S -> (reverse-string (trim-string-left Trim (reverse-string S))))
|
39
|
+
|
40
|
+
\* Trim characters from the front and end of a string *\
|
41
|
+
(define trim-string
|
42
|
+
{(list string) --> string --> string}
|
43
|
+
Trim S -> (reverse-string (trim-string-left Trim (reverse-string (trim-string-left Trim S)))))
|
44
|
+
|
45
|
+
\* Reverse a string. *\
|
46
|
+
(define reverse-string
|
47
|
+
{string --> string}
|
48
|
+
"" -> ""
|
49
|
+
(@s S Ss) -> (@s (reverse-string Ss) S))
|
50
|
+
|
51
|
+
\* A string of digits? *\
|
52
|
+
(define alldigits?
|
53
|
+
{string --> boolean}
|
54
|
+
"" -> true
|
55
|
+
(@s S Ss) -> (and (digit? S) (alldigits? Ss)))
|
56
|
+
|
57
|
+
(define digit?
|
58
|
+
{string --> boolean}
|
59
|
+
S -> (element? S ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9"]))
|
@@ -0,0 +1,71 @@
|
|
1
|
+
(define defstruct
|
2
|
+
Name Slots
|
3
|
+
-> (let Attributes (map fst Slots)
|
4
|
+
Types (map snd Slots)
|
5
|
+
Selectors (selectors Name Attributes)
|
6
|
+
Constructor (constructor Name Attributes)
|
7
|
+
Recognisor (recognisor Name)
|
8
|
+
ConstructorType (constructor-type Name Types)
|
9
|
+
SelectorTypes (selector-types Name Attributes Types)
|
10
|
+
RecognisorType (recognisor-type Name)
|
11
|
+
Name))
|
12
|
+
|
13
|
+
(define selector-types
|
14
|
+
_ [] [] -> (gensym (protect X))
|
15
|
+
Name [Attribute | Attributes] [Type | Types]
|
16
|
+
-> (let Selector (concat Name (concat - Attribute))
|
17
|
+
SelectorType [Name --> Type]
|
18
|
+
TypeDecl (declare Selector SelectorType)
|
19
|
+
(selector-types Name Attributes Types)))
|
20
|
+
|
21
|
+
(define recognisor-type
|
22
|
+
Name -> (let Recognisor (concat Name ?)
|
23
|
+
(declare Recognisor [Name --> boolean])))
|
24
|
+
|
25
|
+
(define constructor-type
|
26
|
+
Name Types -> (let Constructor (concat make- Name)
|
27
|
+
Type (assemble-type Types Name)
|
28
|
+
(declare Constructor Type)))
|
29
|
+
|
30
|
+
(define assemble-type
|
31
|
+
[ ] Name -> Name
|
32
|
+
[Type | Types] Name -> [Type --> (assemble-type Types Name)])
|
33
|
+
|
34
|
+
(declare defstruct [symbol --> [list [symbol * symbol]] --> symbol])
|
35
|
+
|
36
|
+
(define selectors
|
37
|
+
Name Attributes -> (map (/. A (selector Name A)) Attributes))
|
38
|
+
|
39
|
+
(define selector
|
40
|
+
Name Attribute
|
41
|
+
-> (let SelectorName (concat Name (concat - Attribute))
|
42
|
+
(eval [define SelectorName
|
43
|
+
(protect Structure) -> [let (protect LookUp) [assoc Attribute (protect Structure)]
|
44
|
+
[if [empty? (protect LookUp)]
|
45
|
+
[error "~A is not an attribute of ~A.~%"
|
46
|
+
Attribute Name]
|
47
|
+
[tail (protect LookUp)]]]])))
|
48
|
+
|
49
|
+
(define constructor
|
50
|
+
Name Attributes
|
51
|
+
-> (let ConstructorName (concat make- Name)
|
52
|
+
Parameters (params Attributes)
|
53
|
+
(eval [define ConstructorName |
|
54
|
+
(append Parameters
|
55
|
+
[-> [cons [cons structure Name]
|
56
|
+
(make-association-list Attributes
|
57
|
+
Parameters)]])])))
|
58
|
+
|
59
|
+
(define params
|
60
|
+
[] -> []
|
61
|
+
[_ | Attributes] -> [(gensym (protect X)) | (params Attributes)])
|
62
|
+
|
63
|
+
(define make-association-list
|
64
|
+
[] [] -> []
|
65
|
+
[A | As] [P | Ps] -> [cons [cons A P] (make-association-list As Ps)])
|
66
|
+
|
67
|
+
(define recognisor
|
68
|
+
Name -> (let RecognisorName (concat Name ?)
|
69
|
+
(eval [define RecognisorName
|
70
|
+
[cons [cons structure Name] _] -> true
|
71
|
+
_ -> false])))
|