shen-ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. data/.gitignore +4 -0
  2. data/.rspec +0 -0
  3. data/Gemfile +6 -0
  4. data/Gemfile.lock +20 -0
  5. data/MIT_LICENSE.txt +26 -0
  6. data/README.md +94 -0
  7. data/bin/shen_test_suite.rb +9 -0
  8. data/bin/srrepl +23 -0
  9. data/lib/kl.rb +7 -0
  10. data/lib/kl/absvector.rb +12 -0
  11. data/lib/kl/compiler.rb +253 -0
  12. data/lib/kl/cons.rb +51 -0
  13. data/lib/kl/empty_list.rb +12 -0
  14. data/lib/kl/environment.rb +123 -0
  15. data/lib/kl/error.rb +4 -0
  16. data/lib/kl/internal_error.rb +7 -0
  17. data/lib/kl/lexer.rb +186 -0
  18. data/lib/kl/primitives/arithmetic.rb +60 -0
  19. data/lib/kl/primitives/assignments.rb +18 -0
  20. data/lib/kl/primitives/booleans.rb +17 -0
  21. data/lib/kl/primitives/error_handling.rb +13 -0
  22. data/lib/kl/primitives/generic_functions.rb +22 -0
  23. data/lib/kl/primitives/lists.rb +21 -0
  24. data/lib/kl/primitives/streams.rb +38 -0
  25. data/lib/kl/primitives/strings.rb +55 -0
  26. data/lib/kl/primitives/symbols.rb +17 -0
  27. data/lib/kl/primitives/time.rb +17 -0
  28. data/lib/kl/primitives/vectors.rb +30 -0
  29. data/lib/kl/reader.rb +40 -0
  30. data/lib/kl/trampoline.rb +14 -0
  31. data/lib/shen_ruby.rb +7 -0
  32. data/lib/shen_ruby/version.rb +3 -0
  33. data/shen-ruby.gemspec +26 -0
  34. data/shen/README.txt +17 -0
  35. data/shen/lib/shen_ruby/shen.rb +124 -0
  36. data/shen/license.txt +34 -0
  37. data/shen/release/benchmarks/N_queens.shen +45 -0
  38. data/shen/release/benchmarks/README.shen +14 -0
  39. data/shen/release/benchmarks/benchmarks.shen +56 -0
  40. data/shen/release/benchmarks/bigprog +2173 -0
  41. data/shen/release/benchmarks/br.shen +13 -0
  42. data/shen/release/benchmarks/einstein.shen +33 -0
  43. data/shen/release/benchmarks/heatwave.gif +0 -0
  44. data/shen/release/benchmarks/interpreter.shen +219 -0
  45. data/shen/release/benchmarks/picture.jpg +0 -0
  46. data/shen/release/benchmarks/plato.jpg +0 -0
  47. data/shen/release/benchmarks/powerset.shen +10 -0
  48. data/shen/release/benchmarks/prime.shen +10 -0
  49. data/shen/release/benchmarks/short.shen +129 -0
  50. data/shen/release/benchmarks/text.txt +68 -0
  51. data/shen/release/k_lambda/core.kl +1002 -0
  52. data/shen/release/k_lambda/declarations.kl +1021 -0
  53. data/shen/release/k_lambda/load.kl +94 -0
  54. data/shen/release/k_lambda/macros.kl +479 -0
  55. data/shen/release/k_lambda/prolog.kl +1309 -0
  56. data/shen/release/k_lambda/reader.kl +1058 -0
  57. data/shen/release/k_lambda/sequent.kl +556 -0
  58. data/shen/release/k_lambda/sys.kl +582 -0
  59. data/shen/release/k_lambda/t-star.kl +3493 -0
  60. data/shen/release/k_lambda/toplevel.kl +223 -0
  61. data/shen/release/k_lambda/track.kl +208 -0
  62. data/shen/release/k_lambda/types.kl +455 -0
  63. data/shen/release/k_lambda/writer.kl +108 -0
  64. data/shen/release/k_lambda/yacc.kl +280 -0
  65. data/shen/release/test_programs/Chap13/problems.txt +26 -0
  66. data/shen/release/test_programs/README.shen +53 -0
  67. data/shen/release/test_programs/TinyLispFunctions.txt +16 -0
  68. data/shen/release/test_programs/TinyTypes.shen +55 -0
  69. data/shen/release/test_programs/binary.shen +24 -0
  70. data/shen/release/test_programs/bubble_version_1.shen +28 -0
  71. data/shen/release/test_programs/bubble_version_2.shen +22 -0
  72. data/shen/release/test_programs/calculator.shen +21 -0
  73. data/shen/release/test_programs/cartprod.shen +23 -0
  74. data/shen/release/test_programs/change.shen +25 -0
  75. data/shen/release/test_programs/classes-defaults.shen +94 -0
  76. data/shen/release/test_programs/classes-inheritance.shen +100 -0
  77. data/shen/release/test_programs/classes-typed.shen +74 -0
  78. data/shen/release/test_programs/classes-untyped.shen +46 -0
  79. data/shen/release/test_programs/depth_.shen +14 -0
  80. data/shen/release/test_programs/einstein.shen +33 -0
  81. data/shen/release/test_programs/fruit_machine.shen +46 -0
  82. data/shen/release/test_programs/interpreter.shen +219 -0
  83. data/shen/release/test_programs/metaprog.shen +85 -0
  84. data/shen/release/test_programs/minim.shen +193 -0
  85. data/shen/release/test_programs/mutual.shen +11 -0
  86. data/shen/release/test_programs/n_queens.shen +45 -0
  87. data/shen/release/test_programs/newton_version_1.shen +33 -0
  88. data/shen/release/test_programs/newton_version_2.shen +24 -0
  89. data/shen/release/test_programs/parse.prl +14 -0
  90. data/shen/release/test_programs/parser.shen +52 -0
  91. data/shen/release/test_programs/powerset.shen +10 -0
  92. data/shen/release/test_programs/prime.shen +10 -0
  93. data/shen/release/test_programs/proof_assistant.shen +81 -0
  94. data/shen/release/test_programs/proplog_version_1.shen +25 -0
  95. data/shen/release/test_programs/proplog_version_2.shen +27 -0
  96. data/shen/release/test_programs/qmachine.shen +67 -0
  97. data/shen/release/test_programs/red-black.shen +55 -0
  98. data/shen/release/test_programs/search.shen +56 -0
  99. data/shen/release/test_programs/semantic_net.shen +44 -0
  100. data/shen/release/test_programs/spreadsheet.shen +35 -0
  101. data/shen/release/test_programs/stack.shen +27 -0
  102. data/shen/release/test_programs/streams.shen +20 -0
  103. data/shen/release/test_programs/strings.shen +59 -0
  104. data/shen/release/test_programs/structures-typed.shen +71 -0
  105. data/shen/release/test_programs/structures-untyped.shen +42 -0
  106. data/shen/release/test_programs/tests.shen +294 -0
  107. data/shen/release/test_programs/types.shen +11 -0
  108. data/shen/release/test_programs/whist.shen +240 -0
  109. data/shen/release/test_programs/yacc.shen +136 -0
  110. data/spec/kl/cons_spec.rb +12 -0
  111. data/spec/kl/environment_spec.rb +306 -0
  112. data/spec/kl/lexer_spec.rb +149 -0
  113. data/spec/kl/primitives/generic_functions_spec.rb +29 -0
  114. data/spec/kl/primitives/symbols_spec.rb +21 -0
  115. data/spec/kl/reader_spec.rb +36 -0
  116. data/spec/spec_helper.rb +2 -0
  117. metadata +189 -0
@@ -0,0 +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
16
+ (lispcons (car x) (join (cdr x) y))))
@@ -0,0 +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)])
@@ -0,0 +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])])
@@ -0,0 +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
+
@@ -0,0 +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
+
@@ -0,0 +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
+
@@ -0,0 +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
+
@@ -0,0 +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
+
@@ -0,0 +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!"))
@@ -0,0 +1,100 @@
1
+ (declare defclass [symbol --> [list [class A]] --> [list [symbol * symbol]] --> symbol])
2
+
3
+ (datatype subtype
4
+
5
+ (subtype B A); X : B;
6
+ _____________________
7
+ X : A;)
8
+
9
+ (define defclass
10
+ Class SuperClasses ClassDef
11
+ -> (let Attributes (map fst ClassDef)
12
+ Inherited (put-prop Class attributes
13
+ (append Attributes (collect-attributes SuperClasses)))
14
+ Types (record-attribute-types Class ClassDef)
15
+ Assoc (map (/. Attribute [Attribute | fail!]) Inherited)
16
+ ClassDef [[class | Class] | Assoc]
17
+ Store (put-prop Class classdef ClassDef)
18
+ RecordClass (axiom Class Class [class Class])
19
+ SubTypes (record-subtypes Class SuperClasses)
20
+ Class))
21
+
22
+ (define record-subtypes
23
+ _ [] -> _
24
+ Class SuperClasses -> (eval [datatype (concat Class superclasses)
25
+ | (record-subtypes-help Class SuperClasses)]))
26
+
27
+ (define record-subtypes-help
28
+ _ [] -> []
29
+ Class [SuperClass | SuperClasses] -> [_______________________
30
+ [subtype SuperClass Class]; |
31
+ (record-subtypes-help Class SuperClasses)])
32
+
33
+ (define collect-attributes
34
+ [] -> []
35
+ [SuperClass | SuperClasses] -> (append (get-prop SuperClass attributes [])
36
+ (collect-attributes SuperClasses)))
37
+
38
+ (define axiom
39
+ DataType X A -> (eval [datatype DataType
40
+ ________
41
+ X : A;]))
42
+
43
+ (define record-attribute-types
44
+ _ [] -> []
45
+ Class [(@p Attribute Type) | ClassDef]
46
+ -> (let DataTypeName (concat Class Attribute)
47
+ DataType (axiom DataTypeName Attribute [attribute Class Type])
48
+ (record-attribute-types Class ClassDef)))
49
+
50
+ (declare make-instance [[class Class] --> [instance Class]])
51
+
52
+ (define make-instance
53
+ Class -> (let ClassDef (get-prop Class classdef [])
54
+ (if (empty? ClassDef)
55
+ (error "class ~A does not exist~%" Class)
56
+ ClassDef)))
57
+
58
+ (declare get-value [[attribute Class A] --> [instance Class] --> A])
59
+
60
+ (define get-value
61
+ Attribute Instance -> (let LookUp (assoc Attribute Instance)
62
+ (get-value-test LookUp)))
63
+
64
+ (define get-value-test
65
+ [ ] -> (error "no such attribute!~%")
66
+ [_ | fail!] -> (error "no such value!~%")
67
+ [_ | Value] -> Value)
68
+
69
+ (declare has-value? [[attribute Class A] --> [instance Class] --> boolean])
70
+
71
+ (define has-value?
72
+ Attribute Instance -> (let LookUp (assoc Attribute Instance)
73
+ (has-value-test LookUp)))
74
+
75
+ (define has-value-test
76
+ [ ] -> (error "no such attribute!~%")
77
+ [_ | fail!] -> false
78
+ _ -> true)
79
+
80
+ (declare has-attribute? [symbol --> [instance Class] --> boolean])
81
+
82
+ (define has-attribute?
83
+ Attribute Instance -> (let LookUp (assoc Attribute Instance)
84
+ (not (empty? LookUp))))
85
+
86
+ (declare change-value [[instance Class] --> [attribute Class A] --> A --> [instance Class]])
87
+
88
+ (define change-value
89
+ _ class _ -> (error "cannot change the class of an instance!~%")
90
+ [ ] _ _ -> (error "no such attribute!~%")
91
+ [[Attribute | _] | Instance] Attribute Value
92
+ -> [[Attribute | Value] | Instance]
93
+ [Slot | Instance] Attribute Value
94
+ -> [Slot | (change-value Instance Attribute Value)])
95
+
96
+ (declare instance-of [[instance Class] --> [class Class]])
97
+
98
+ (define instance-of
99
+ [[class | Class] | _] -> Class
100
+ _ -> (error "not a class instance!"))
@@ -0,0 +1,74 @@
1
+ (declare defclass [symbol --> [list [symbol * symbol]] --> symbol])
2
+
3
+ (define defclass
4
+ Class ClassDef -> (let Attributes (map fst ClassDef)
5
+ Types (record-attribute-types Class ClassDef)
6
+ Assoc (map (/. Attribute [Attribute | fail]) Attributes)
7
+ ClassDef [[class | Class] | Assoc]
8
+ Store (put Class classdef ClassDef)
9
+ RecordClass (axiom Class Class [class Class])
10
+ Class))
11
+
12
+ (define axiom
13
+ DataType X A -> (eval [datatype DataType
14
+ ________
15
+ X : A;]))
16
+
17
+ (define record-attribute-types
18
+ _ [] -> []
19
+ Class [(@p Attribute Type) | ClassDef]
20
+ -> (let DataTypeName (concat Class Attribute)
21
+ DataType (axiom DataTypeName Attribute [attribute Class Type])
22
+ (record-attribute-types Class ClassDef)))
23
+
24
+ (declare make-instance [[class Class] --> [instance Class]])
25
+
26
+ (define make-instance
27
+ Class -> (let ClassDef (trap-error (get Class classdef) (/. E []))
28
+ (if (empty? ClassDef)
29
+ (error "class ~A does not exist~%" Class)
30
+ ClassDef)))
31
+
32
+ (declare get-value [[attribute Class A] --> [instance Class] --> A])
33
+
34
+ (define get-value
35
+ Attribute Instance -> (let LookUp (assoc Attribute Instance)
36
+ (get-value-test LookUp)))
37
+
38
+ (define get-value-test
39
+ [ ] -> (error "no such attribute!~%")
40
+ [_ | fail!] -> (error "no such value!~%")
41
+ [_ | Value] -> Value)
42
+
43
+ (declare has-value? [[attribute Class A] --> [instance Class] --> boolean])
44
+
45
+ (define has-value?
46
+ Attribute Instance -> (let LookUp (assoc Attribute Instance)
47
+ (has-value-test LookUp)))
48
+
49
+ (define has-value-test
50
+ [ ] -> (error "no such attribute!~%")
51
+ [_ | fail] -> false
52
+ _ -> true)
53
+
54
+ (declare has-attribute? [symbol --> [instance Class] --> boolean])
55
+
56
+ (define has-attribute?
57
+ Attribute Instance -> (let LookUp (assoc Attribute Instance)
58
+ (not (empty? LookUp))))
59
+
60
+ (declare change-value [[instance Class] --> [attribute Class A] --> A --> [instance Class]])
61
+
62
+ (define change-value
63
+ _ class _ -> (error "cannot change the class of an instance!~%")
64
+ [ ] _ _ -> (error "no such attribute!~%")
65
+ [[Attribute | _] | Instance] Attribute Value
66
+ -> [[Attribute | Value] | Instance]
67
+ [Slot | Instance] Attribute Value
68
+ -> [Slot | (change-value Instance Attribute Value)])
69
+
70
+ (declare instance-of [[instance Class] --> [class Class]])
71
+
72
+ (define instance-of
73
+ [[class | Class] | _] -> Class
74
+ _ -> (error "not a class instance!"))