shen-ruby 0.12.1 → 0.13.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/HISTORY.md +5 -0
- data/README.md +8 -12
- data/Rakefile +4 -9
- data/bin/shen_test_suite.rb +0 -1
- data/bin/srrepl +2 -4
- data/lib/shen_ruby/shen.rb +98 -0
- data/lib/shen_ruby/version.rb +1 -1
- data/shen-ruby.gemspec +3 -3
- data/shen/README.txt +9 -13
- data/shen/release/BSD +24 -0
- data/shen/release/klambda/core.kl +157 -0
- data/shen/release/klambda/declarations.kl +109 -0
- data/shen/release/klambda/load.kl +59 -0
- data/shen/release/klambda/macros.kl +91 -0
- data/shen/release/klambda/prolog.kl +228 -0
- data/shen/release/klambda/reader.kl +198 -0
- data/shen/release/klambda/sequent.kl +142 -0
- data/shen/release/klambda/sys.kl +253 -0
- data/shen/release/klambda/t-star.kl +123 -0
- data/shen/release/klambda/toplevel.kl +110 -0
- data/shen/release/klambda/track.kl +79 -0
- data/shen/release/{k_lambda → klambda}/types.kl +41 -63
- data/shen/release/klambda/writer.kl +81 -0
- data/shen/release/klambda/yacc.kl +87 -0
- data/shen/release/license.pdf +0 -0
- 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
- metadata +21 -35
- data/shen/lib/shen_ruby/shen.rb +0 -160
- data/shen/license.txt +0 -34
- data/shen/release/benchmarks/N_queens.shen +0 -45
- data/shen/release/benchmarks/README.shen +0 -14
- data/shen/release/benchmarks/benchmarks.shen +0 -52
- data/shen/release/benchmarks/bigprog +0 -2173
- data/shen/release/benchmarks/einstein.shen +0 -33
- data/shen/release/benchmarks/heatwave.gif +0 -0
- data/shen/release/benchmarks/interpreter.shen +0 -219
- data/shen/release/benchmarks/jnk.shen +0 -194
- data/shen/release/benchmarks/picture.jpg +0 -0
- data/shen/release/benchmarks/plato.jpg +0 -0
- data/shen/release/benchmarks/powerset.shen +0 -10
- data/shen/release/benchmarks/prime.shen +0 -10
- data/shen/release/benchmarks/short.shen +0 -129
- data/shen/release/benchmarks/text.txt +0 -68
- data/shen/release/k_lambda/core.kl +0 -181
- data/shen/release/k_lambda/declarations.kl +0 -131
- data/shen/release/k_lambda/load.kl +0 -84
- data/shen/release/k_lambda/macros.kl +0 -112
- data/shen/release/k_lambda/prolog.kl +0 -252
- data/shen/release/k_lambda/reader.kl +0 -222
- data/shen/release/k_lambda/sequent.kl +0 -166
- data/shen/release/k_lambda/sys.kl +0 -271
- data/shen/release/k_lambda/t-star.kl +0 -139
- data/shen/release/k_lambda/toplevel.kl +0 -135
- data/shen/release/k_lambda/track.kl +0 -103
- data/shen/release/k_lambda/writer.kl +0 -105
- data/shen/release/k_lambda/yacc.kl +0 -113
|
@@ -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
|
+
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
(define count-change
|
|
2
|
-
Amount -> (count-change* Amount 200))
|
|
3
|
-
|
|
4
|
-
(define count-change*
|
|
5
|
-
0 _ -> 1
|
|
6
|
-
_ 0 -> 0
|
|
7
|
-
Amount _ -> 0 where (> 0 Amount)
|
|
8
|
-
Amount Fst_Denom
|
|
9
|
-
-> (+ (count-change* (- Amount Fst_Denom) Fst_Denom)
|
|
10
|
-
(count-change* Amount (next-denom Fst_Denom))))
|
|
11
|
-
|
|
12
|
-
(define next-denom
|
|
13
|
-
200 -> 100
|
|
14
|
-
100 -> 50
|
|
15
|
-
50 -> 20
|
|
16
|
-
20 -> 10
|
|
17
|
-
10 -> 5
|
|
18
|
-
5 -> 2
|
|
19
|
-
2 -> 1
|
|
20
|
-
1 -> 0)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
(define count-change
|
|
2
|
+
Amount -> (count-change* Amount 200))
|
|
3
|
+
|
|
4
|
+
(define count-change*
|
|
5
|
+
0 _ -> 1
|
|
6
|
+
_ 0 -> 0
|
|
7
|
+
Amount _ -> 0 where (> 0 Amount)
|
|
8
|
+
Amount Fst_Denom
|
|
9
|
+
-> (+ (count-change* (- Amount Fst_Denom) Fst_Denom)
|
|
10
|
+
(count-change* Amount (next-denom Fst_Denom))))
|
|
11
|
+
|
|
12
|
+
(define next-denom
|
|
13
|
+
200 -> 100
|
|
14
|
+
100 -> 50
|
|
15
|
+
50 -> 20
|
|
16
|
+
20 -> 10
|
|
17
|
+
10 -> 5
|
|
18
|
+
5 -> 2
|
|
19
|
+
2 -> 1
|
|
20
|
+
1 -> 0)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
@@ -1,94 +1,94 @@
|
|
|
1
|
-
(datatype class
|
|
2
|
-
|
|
3
|
-
Slots : [slot];
|
|
4
|
-
_______________________________________
|
|
5
|
-
(defclass Class Slots) : (class Class);
|
|
6
|
-
|
|
7
|
-
Attribute : symbol; Type : symbol;
|
|
8
|
-
===================================
|
|
9
|
-
(@p Attribute Type) : slot;
|
|
10
|
-
|
|
11
|
-
Default : Type; Attribute : symbol; Type : symbol;
|
|
12
|
-
==================================================
|
|
13
|
-
(@p Attribute Type Default) : slot;)
|
|
14
|
-
|
|
15
|
-
(define defclass
|
|
16
|
-
Class ClassDef -> (let Attributes (map fst ClassDef)
|
|
17
|
-
Types (record-attribute-types Class ClassDef)
|
|
18
|
-
Assoc (map assign-values ClassDef)
|
|
19
|
-
NewClassDef [[class | Class] | Assoc]
|
|
20
|
-
Store (put-prop Class classdef NewClassDef)
|
|
21
|
-
RecordClass (axiom Class Class [class Class])
|
|
22
|
-
Class))
|
|
23
|
-
|
|
24
|
-
(define assign-values
|
|
25
|
-
(@p Attribute _ Value) -> [Attribute | Value]
|
|
26
|
-
(@p Attribute _) -> [Attribute | fail!])
|
|
27
|
-
|
|
28
|
-
(define axiom
|
|
29
|
-
DataType X A -> (eval [datatype DataType
|
|
30
|
-
________
|
|
31
|
-
X : A;]))
|
|
32
|
-
|
|
33
|
-
(define record-attribute-types
|
|
34
|
-
_ [] -> []
|
|
35
|
-
Class [(@p Attribute Type _) | ClassDef]
|
|
36
|
-
-> (let DataTypeName (concat Class Attribute)
|
|
37
|
-
DataType (axiom DataTypeName Attribute [attribute Class Type])
|
|
38
|
-
(record-attribute-types Class ClassDef))
|
|
39
|
-
Class [(@p Attribute Type) | ClassDef]
|
|
40
|
-
-> (let DataTypeName (concat Class Attribute)
|
|
41
|
-
DataType (axiom DataTypeName Attribute [attribute Class Type])
|
|
42
|
-
(record-attribute-types Class ClassDef)))
|
|
43
|
-
|
|
44
|
-
(declare make-instance [[class Class] --> [instance Class]])
|
|
45
|
-
|
|
46
|
-
(define make-instance
|
|
47
|
-
Class -> (let ClassDef (get-prop Class classdef [])
|
|
48
|
-
(if (empty? ClassDef)
|
|
49
|
-
(error "class ~A does not exist~%" Class)
|
|
50
|
-
ClassDef)))
|
|
51
|
-
|
|
52
|
-
(declare get-value [[attribute Class A] --> [instance Class] --> A])
|
|
53
|
-
|
|
54
|
-
(define get-value
|
|
55
|
-
Attribute Instance -> (let LookUp (assoc Attribute Instance)
|
|
56
|
-
(get-value-test LookUp)))
|
|
57
|
-
|
|
58
|
-
(define get-value-test
|
|
59
|
-
[ ] -> (error "no such attribute!~%")
|
|
60
|
-
[_ | fail!] -> (error "no such value!~%")
|
|
61
|
-
[_ | Value] -> Value)
|
|
62
|
-
|
|
63
|
-
(declare has-value? [[attribute Class A] --> [instance Class] --> boolean])
|
|
64
|
-
|
|
65
|
-
(define has-value?
|
|
66
|
-
Attribute Instance -> (let LookUp (assoc Attribute Instance)
|
|
67
|
-
(has-value-test LookUp)))
|
|
68
|
-
|
|
69
|
-
(define has-value-test
|
|
70
|
-
[ ] -> (error "no such attribute!~%")
|
|
71
|
-
[_ | fail!] -> false
|
|
72
|
-
_ -> true)
|
|
73
|
-
|
|
74
|
-
(declare has-attribute? [symbol --> [instance Class] --> boolean])
|
|
75
|
-
|
|
76
|
-
(define has-attribute?
|
|
77
|
-
Attribute Instance -> (let LookUp (assoc Attribute Instance)
|
|
78
|
-
(not (empty? LookUp))))
|
|
79
|
-
|
|
80
|
-
(declare change-value [[instance Class] --> [attribute Class A] --> A --> [instance Class]])
|
|
81
|
-
|
|
82
|
-
(define change-value
|
|
83
|
-
_ class _ -> (error "cannot change the class of an instance!~%")
|
|
84
|
-
[ ] _ _ -> (error "no such attribute!~%")
|
|
85
|
-
[[Attribute | _] | Instance] Attribute Value
|
|
86
|
-
-> [[Attribute | Value] | Instance]
|
|
87
|
-
[Slot | Instance] Attribute Value
|
|
88
|
-
-> [Slot | (change-value Instance Attribute Value)])
|
|
89
|
-
|
|
90
|
-
(declare instance-of [[instance Class] --> [class Class]])
|
|
91
|
-
|
|
92
|
-
(define instance-of
|
|
93
|
-
[[class | Class] | _] -> Class
|
|
94
|
-
_ -> (error "not a class instance!"))
|
|
1
|
+
(datatype class
|
|
2
|
+
|
|
3
|
+
Slots : [slot];
|
|
4
|
+
_______________________________________
|
|
5
|
+
(defclass Class Slots) : (class Class);
|
|
6
|
+
|
|
7
|
+
Attribute : symbol; Type : symbol;
|
|
8
|
+
===================================
|
|
9
|
+
(@p Attribute Type) : slot;
|
|
10
|
+
|
|
11
|
+
Default : Type; Attribute : symbol; Type : symbol;
|
|
12
|
+
==================================================
|
|
13
|
+
(@p Attribute Type Default) : slot;)
|
|
14
|
+
|
|
15
|
+
(define defclass
|
|
16
|
+
Class ClassDef -> (let Attributes (map fst ClassDef)
|
|
17
|
+
Types (record-attribute-types Class ClassDef)
|
|
18
|
+
Assoc (map assign-values ClassDef)
|
|
19
|
+
NewClassDef [[class | Class] | Assoc]
|
|
20
|
+
Store (put-prop Class classdef NewClassDef)
|
|
21
|
+
RecordClass (axiom Class Class [class Class])
|
|
22
|
+
Class))
|
|
23
|
+
|
|
24
|
+
(define assign-values
|
|
25
|
+
(@p Attribute _ Value) -> [Attribute | Value]
|
|
26
|
+
(@p Attribute _) -> [Attribute | fail!])
|
|
27
|
+
|
|
28
|
+
(define axiom
|
|
29
|
+
DataType X A -> (eval [datatype DataType
|
|
30
|
+
________
|
|
31
|
+
X : A;]))
|
|
32
|
+
|
|
33
|
+
(define record-attribute-types
|
|
34
|
+
_ [] -> []
|
|
35
|
+
Class [(@p Attribute Type _) | ClassDef]
|
|
36
|
+
-> (let DataTypeName (concat Class Attribute)
|
|
37
|
+
DataType (axiom DataTypeName Attribute [attribute Class Type])
|
|
38
|
+
(record-attribute-types Class ClassDef))
|
|
39
|
+
Class [(@p Attribute Type) | ClassDef]
|
|
40
|
+
-> (let DataTypeName (concat Class Attribute)
|
|
41
|
+
DataType (axiom DataTypeName Attribute [attribute Class Type])
|
|
42
|
+
(record-attribute-types Class ClassDef)))
|
|
43
|
+
|
|
44
|
+
(declare make-instance [[class Class] --> [instance Class]])
|
|
45
|
+
|
|
46
|
+
(define make-instance
|
|
47
|
+
Class -> (let ClassDef (get-prop Class classdef [])
|
|
48
|
+
(if (empty? ClassDef)
|
|
49
|
+
(error "class ~A does not exist~%" Class)
|
|
50
|
+
ClassDef)))
|
|
51
|
+
|
|
52
|
+
(declare get-value [[attribute Class A] --> [instance Class] --> A])
|
|
53
|
+
|
|
54
|
+
(define get-value
|
|
55
|
+
Attribute Instance -> (let LookUp (assoc Attribute Instance)
|
|
56
|
+
(get-value-test LookUp)))
|
|
57
|
+
|
|
58
|
+
(define get-value-test
|
|
59
|
+
[ ] -> (error "no such attribute!~%")
|
|
60
|
+
[_ | fail!] -> (error "no such value!~%")
|
|
61
|
+
[_ | Value] -> Value)
|
|
62
|
+
|
|
63
|
+
(declare has-value? [[attribute Class A] --> [instance Class] --> boolean])
|
|
64
|
+
|
|
65
|
+
(define has-value?
|
|
66
|
+
Attribute Instance -> (let LookUp (assoc Attribute Instance)
|
|
67
|
+
(has-value-test LookUp)))
|
|
68
|
+
|
|
69
|
+
(define has-value-test
|
|
70
|
+
[ ] -> (error "no such attribute!~%")
|
|
71
|
+
[_ | fail!] -> false
|
|
72
|
+
_ -> true)
|
|
73
|
+
|
|
74
|
+
(declare has-attribute? [symbol --> [instance Class] --> boolean])
|
|
75
|
+
|
|
76
|
+
(define has-attribute?
|
|
77
|
+
Attribute Instance -> (let LookUp (assoc Attribute Instance)
|
|
78
|
+
(not (empty? LookUp))))
|
|
79
|
+
|
|
80
|
+
(declare change-value [[instance Class] --> [attribute Class A] --> A --> [instance Class]])
|
|
81
|
+
|
|
82
|
+
(define change-value
|
|
83
|
+
_ class _ -> (error "cannot change the class of an instance!~%")
|
|
84
|
+
[ ] _ _ -> (error "no such attribute!~%")
|
|
85
|
+
[[Attribute | _] | Instance] Attribute Value
|
|
86
|
+
-> [[Attribute | Value] | Instance]
|
|
87
|
+
[Slot | Instance] Attribute Value
|
|
88
|
+
-> [Slot | (change-value Instance Attribute Value)])
|
|
89
|
+
|
|
90
|
+
(declare instance-of [[instance Class] --> [class Class]])
|
|
91
|
+
|
|
92
|
+
(define instance-of
|
|
93
|
+
[[class | Class] | _] -> Class
|
|
94
|
+
_ -> (error "not a class instance!"))
|