shen-ruby 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +5 -0
  3. data/Gemfile +2 -2
  4. data/HISTORY.md +12 -0
  5. data/README.md +10 -7
  6. data/Rakefile +92 -0
  7. data/bin/srrepl +2 -2
  8. data/k_lambda_spec/primitives/arithmetic_spec.rb +175 -0
  9. data/k_lambda_spec/primitives/assignments_spec.rb +44 -0
  10. data/k_lambda_spec/primitives/generic_functions_spec.rb +115 -2
  11. data/k_lambda_spec/primitives/lists_spec.rb +40 -0
  12. data/k_lambda_spec/primitives/strings_spec.rb +77 -0
  13. data/k_lambda_spec/primitives/symbols_spec.rb +24 -0
  14. data/k_lambda_spec/primitives/vectors_spec.rb +92 -0
  15. data/k_lambda_spec/support/shared_examples.rb +93 -2
  16. data/k_lambda_spec/tail_recursion_spec.rb +30 -0
  17. data/lib/kl/compiler.rb +19 -33
  18. data/lib/kl/environment.rb +1 -0
  19. data/lib/kl/primitives/assignments.rb +1 -0
  20. data/lib/kl/primitives/generic_functions.rb +7 -0
  21. data/lib/kl/primitives/lists.rb +2 -0
  22. data/lib/kl/primitives/strings.rb +13 -5
  23. data/lib/kl/primitives/symbols.rb +1 -0
  24. data/lib/kl/primitives/vectors.rb +5 -0
  25. data/lib/shen_ruby/version.rb +1 -1
  26. data/shen-ruby.gemspec +1 -1
  27. data/shen/lib/shen_ruby/shen.rb +5 -6
  28. data/shen/release/benchmarks/benchmarks.shen +0 -4
  29. data/shen/release/benchmarks/interpreter.shen +2 -2
  30. data/shen/release/benchmarks/plato.jpg +0 -0
  31. data/shen/release/k_lambda/core.kl +171 -1000
  32. data/shen/release/k_lambda/declarations.kl +90 -992
  33. data/shen/release/k_lambda/load.kl +69 -81
  34. data/shen/release/k_lambda/macros.kl +113 -478
  35. data/shen/release/k_lambda/prolog.kl +250 -1307
  36. data/shen/release/k_lambda/reader.kl +115 -996
  37. data/shen/release/k_lambda/sequent.kl +154 -554
  38. data/shen/release/k_lambda/sys.kl +246 -562
  39. data/shen/release/k_lambda/t-star.kl +114 -3643
  40. data/shen/release/k_lambda/toplevel.kl +136 -221
  41. data/shen/release/k_lambda/track.kl +101 -206
  42. data/shen/release/k_lambda/types.kl +143 -298
  43. data/shen/release/k_lambda/writer.kl +93 -106
  44. data/shen/release/k_lambda/yacc.kl +77 -252
  45. data/shen/release/test_programs/README.shen +1 -1
  46. data/shen/release/test_programs/classes-typed.shen +1 -1
  47. data/shen/release/test_programs/interpreter.shen +2 -2
  48. data/shen/release/test_programs/metaprog.shen +2 -2
  49. data/shen/release/test_programs/prolog.shen +79 -0
  50. data/shen/release/test_programs/structures-typed.shen +2 -2
  51. data/shen/release/test_programs/tests.shen +19 -80
  52. data/shen/release/test_programs/yacc.shen +11 -15
  53. metadata +14 -6
  54. data/Gemfile.lock +0 -20
  55. data/shen/release/benchmarks/br.shen +0 -13
@@ -9,7 +9,7 @@ following.
9
9
 
10
10
  *\
11
11
 
12
- (package test-harness- [report reset ok passed failed]
12
+ (package test-harness [report reset ok passed failed]
13
13
 
14
14
  (define reset
15
15
  -> (set *passed* (set *failed* 0)))
@@ -1,7 +1,7 @@
1
1
  (declare defclass [symbol --> [list [symbol * symbol]] --> symbol])
2
2
 
3
3
  (define defclass
4
- Class ClassDef -> (let Attributes (map fst ClassDef)
4
+ Class ClassDef -> (let Attributes (map (function fst) ClassDef)
5
5
  Types (record-attribute-types Class ClassDef)
6
6
  Assoc (map (/. Attribute [Attribute | fail]) Attributes)
7
7
  ClassDef [[class | Class] | Assoc]
@@ -101,9 +101,9 @@
101
101
 
102
102
  (define normal_form
103
103
  {l_formula --> l_formula}
104
- X -> (fix ==> X))
104
+ X -> (fix ==>> X))
105
105
 
106
- (define ==>
106
+ (define ==>>
107
107
  {l_formula --> l_formula}
108
108
  [= X Y] -> (let X* (normal_form X)
109
109
  (let Y* (normal_form Y)
@@ -10,7 +10,7 @@
10
10
  [_ Output] -> Output)
11
11
 
12
12
  (define generate_parser
13
- Grammar -> (map compile_rules (group_rules (parenthesise_rules Grammar))))
13
+ Grammar -> (map (/. X (compile_rules X)) (group_rules (parenthesise_rules Grammar))))
14
14
 
15
15
  (define parenthesise_rules
16
16
  [S --> | Rest] -> (parenthesise_rules1 [S -->] Rest))
@@ -76,7 +76,7 @@
76
76
  (define generate_code_for_lex
77
77
  Rules -> (eval (append [define (get_characteristic_non_terminal Rules)
78
78
  (protect X) -> [fail] where [= (protect X) [fail]]
79
- | (mapapp gcfl_help Rules)]
79
+ | (mapapp (function gcfl_help) Rules)]
80
80
  [(protect X) -> [fail]])))
81
81
 
82
82
  (define gcfl_help
@@ -0,0 +1,79 @@
1
+ (defprolog f
2
+ a <--;)
3
+
4
+ (defprolog g
5
+ a <-- ! (f b);
6
+ X <-- (f a);)
7
+
8
+ (defprolog mem
9
+ X [X | _] <--;
10
+ X [Y | Z] <-- (mem X Z);)
11
+
12
+ (defprolog app
13
+ [] X X <--;
14
+ [X | Y] W [X | Z] <-- (app Y W Z);)
15
+
16
+ (defprolog rev
17
+ [] [] <--;
18
+ [X | Y] Z <-- (rev Y W) (app W [X] Z);)
19
+
20
+ (defprolog enjoys
21
+ willi X <-- (likes mark X);
22
+ mark chocolate <--;
23
+ mark tea <--;) enjoys
24
+
25
+ (defprolog fads
26
+ X <-- (findall Y [enjoys X Y] Friends) (return Friends);) fads
27
+
28
+ (defprolog prop
29
+ A C <-- (proph [[~ C] | A]);) prop
30
+
31
+ (defprolog proph
32
+ A <-- (mem [~ P] A) (mem P A) !;
33
+ A <-- (consistent A) ! (when false);
34
+ (mode [[P & Q] | A] -) <-- ! (proph [P Q | A]);
35
+ (mode [[P <=> Q] | A] -) <-- ! (proph [[P => Q] [Q => P] | A]);
36
+ (mode [[P => Q] | A] -) <-- ! (proph [[[~ P] v Q] | A]);
37
+ (mode [[~ [P v Q]] | A] -) <-- ! (proph [[~ P] [~ Q] | A]);
38
+ (mode [[~ [P & Q]] | A] -) <-- ! (proph [[[~ P] v [~ Q]] | A]);
39
+ (mode [[~ [P => Q]] | A] -) <-- ! (proph [P [~ Q] | A]);
40
+ (mode [[~ [P <=> Q]] | A] -) <-- ! (proph [[~ [[P => Q] v [~ [Q => P]]]] | A]);
41
+ (mode [[P & Q] | A] -) <-- ! (proph [P Q | A]);
42
+ (mode [[P v Q] | A] -) <-- ! (proph [P | A]) ! (proph [Q | A]);
43
+ (mode [P | Ps] -) <-- (app Ps [P] Qs) ! (proph Qs);)
44
+
45
+ (defprolog consistent
46
+ [] <--;
47
+ [P | Ps] <-- (when (symbol? P)) ! (consistent Ps);
48
+ [[~ P] | Ps] <-- (when (symbol? P)) ! (consistent Ps);)
49
+
50
+ (defprolog app
51
+ [] X X <--;
52
+ (mode [X | Y] -) W [X | Z] <-- (app Y W Z);)
53
+
54
+ (defprolog mem
55
+ X (mode [X | _] -) <--;
56
+ X (mode [_ | Y] -) <-- (mem X Y);)
57
+
58
+ (defprolog mapit
59
+ _ [] [] <--;
60
+ Pred [X | Y] [W | Z] <-- (call [Pred X W]) (mapit Pred Y Z);)
61
+
62
+ (defprolog consit
63
+ X [1 X] <--;)
64
+
65
+ (defprolog different
66
+ X Y <-- (~ [identical X Y]);)
67
+
68
+ (defprolog ~
69
+ P <-- (call P) ! (when false);
70
+ _ <--;)
71
+
72
+ (defprolog likes
73
+ john X <-- (tall X) (pretty X);)
74
+
75
+ (defprolog tall
76
+ mary <--;)
77
+
78
+ (defprolog pretty
79
+ mary <--;)
@@ -1,7 +1,7 @@
1
1
  (define defstruct
2
2
  Name Slots
3
- -> (let Attributes (map fst Slots)
4
- Types (map snd Slots)
3
+ -> (let Attributes (map (function fst) Slots)
4
+ Types (map (function snd) Slots)
5
5
  Selectors (selectors Name Attributes)
6
6
  Constructor (constructor Name Attributes)
7
7
  Recognisor (recognisor Name)
@@ -1,84 +1,23 @@
1
1
  (maxinferences 10000000000)
2
2
 
3
3
  (report prolog-tests
4
- (defprolog f
5
- a <--;) f
4
+ (load "prolog.shen") loaded
6
5
  (prolog? (f a)) true
7
- (defprolog g
8
- a <-- ! (f b);
9
- X <-- (f a);) g
10
- (prolog? (g a)) false
11
- (prolog? (g b)) true
12
- (defprolog mem
13
- X [X | _] <--;
14
- X [Y | Z] <-- (mem X Z);) mem
15
- (prolog? (mem 1 [X | 2]) (return X)) 1
16
- (defprolog app
17
- [] X X <--;
18
- [X | Y] W [X | Z] <-- (app Y W Z);) app
19
- (defprolog rev
20
- [] [] <--;
21
- [X | Y] Z <-- (rev Y W) (app W [X] Z);) rev
22
- (prolog? (rev [1 2] X) (return X)) [2 1]
23
- (load "einstein.shen") loaded
24
- (prolog? (einsteins_riddle X) (return X)) german
25
- (defprolog enjoys
26
- willi X <-- (likes mark X);
27
- mark chocolate <--;
28
- mark tea <--;) enjoys
29
- (prolog? (enjoys mark X) (return X)) chocolate
30
- (defprolog fads
31
- X <-- (findall Y [enjoys X Y] Friends) (return Friends);) fads
32
- (prolog? (fads mark)) [tea chocolate]
33
- (defprolog prop
34
- A C <-- (proph [[~ C] | A]);) prop
35
- (defprolog proph
36
- A <-- (mem [~ P] A) (mem P A) !;
37
- A <-- (consistent A) ! (when false);
38
- (mode [[P & Q] | A] -) <-- ! (proph [P Q | A]);
39
- (mode [[P <=> Q] | A] -) <-- ! (proph [[P => Q] [Q => P] | A]);
40
- (mode [[P => Q] | A] -) <-- ! (proph [[[~ P] v Q] | A]);
41
- (mode [[~ [P v Q]] | A] -) <-- ! (proph [[~ P] [~ Q] | A]);
42
- (mode [[~ [P & Q]] | A] -) <-- ! (proph [[[~ P] v [~ Q]] | A]);
43
- (mode [[~ [P => Q]] | A] -) <-- ! (proph [P [~ Q] | A]);
44
- (mode [[~ [P <=> Q]] | A] -) <-- ! (proph [[~ [[P => Q] v [~ [Q => P]]]] | A]);
45
- (mode [[P & Q] | A] -) <-- ! (proph [P Q | A]);
46
- (mode [[P v Q] | A] -) <-- ! (proph [P | A]) ! (proph [Q | A]);
47
- (mode [P | Ps] -) <-- (app Ps [P] Qs) ! (proph Qs);) proph
48
- (defprolog consistent
49
- [] <--;
50
- [P | Ps] <-- (when (symbol? P)) ! (consistent Ps);
51
- [[~ P] | Ps] <-- (when (symbol? P)) ! (consistent Ps);) consistent
52
- (defprolog app
53
- [] X X <--;
54
- (mode [X | Y] -) W [X | Z] <-- (app Y W Z);) app
55
- (defprolog mem
56
- X (mode [X | _] -) <--;
57
- X (mode [_ | Y] -) <-- (mem X Y);) mem
58
- (prolog? (prop [] [p <=> p])) true
59
- (defprolog mapit
60
- _ [] [] <--;
61
- Pred [X | Y] [W | Z] <-- (call [Pred X W]) (mapit Pred Y Z);) mapit
62
- (defprolog consit
63
- X [1 X] <--;) consit
64
- (prolog? (mapit consit [1 2 3] Out) (return Out))
65
- [[1 1] [1 2] [1 3]]
66
- (defprolog different
67
- X Y <-- (~ [identical X Y]);) different
68
- (defprolog ~
69
- P <-- (call P) ! (when false);
70
- _ <--;) ~
71
- (prolog? (different a b)) true
72
- (prolog? (different a a)) false
73
- (defprolog likes
74
- john X <-- (tall X) (pretty X);) likes
75
- (defprolog tall
76
- mary <--;) tall
77
- (defprolog pretty
78
- mary <--;) pretty
79
- (prolog? (likes john Who) (return Who)) mary
80
- (load "parse.prl") loaded
81
- (prolog? (pparse ["the" + ["boy" + "jumps"]]
6
+ (prolog? (g a)) false
7
+ (prolog? (g b)) true
8
+ (prolog? (mem 1 [X | 2]) (return X)) 1
9
+ (prolog? (rev [1 2] X) (return X)) [2 1]
10
+ (load "einstein.shen") loaded
11
+ (prolog? (einsteins_riddle X) (return X)) german
12
+ (prolog? (enjoys mark X) (return X)) chocolate
13
+ (prolog? (fads mark)) [tea chocolate]
14
+ (prolog? (prop [] [p <=> p])) true
15
+ (prolog? (mapit consit [1 2 3] Out) (return Out)) [[1 1] [1 2] [1 3]]
16
+ (prolog? (different a b)) true
17
+ (prolog? (different a a)) false
18
+ (prolog? (likes john Who) (return Who)) mary
19
+ (load "parse.prl") loaded
20
+ (prolog? (pparse ["the" + ["boy" + "jumps"]]
82
21
  [[s = [np + vp]]
83
22
  [np = [det + n]]
84
23
  [det = "the"]
@@ -223,7 +162,7 @@
223
162
  (report "yacc"
224
163
  (load "yacc.shen") loaded
225
164
  (compile <sent> [the cat likes the dog]) [the cat likes the dog]
226
- (compile <sent> [the cat likes the canary]) (fail)
165
+ (compile <sent> [the cat likes the canary] (/. E (fail))) (fail)
227
166
  (compile <asbscs> [a a a b b c]) [a a a b b c]
228
167
  (compile <find-digit> [a v f g 6 y u]) [6]
229
168
  (compile <vp> [chases the cat]) [chases the cat]
@@ -231,7 +170,7 @@
231
170
  (compile <sent'> [the cat likes the dog]) [is it true that your father likes the dog ?]
232
171
  (compile <as> [a a a]) [a a a]
233
172
  (compile <find-digit'> [a v f g 6 y u]) [6 y u]
234
- (compile <asbs'cs> [a v f g 6 y u]) (fail)
173
+ (compile <asbs'cs> [a v f g 6 y u] (/. E (fail))) (fail)
235
174
  (compile <find-digit''> [a v f g 6 y u]) 6
236
175
  (compile <anbncn> [a a a b b b c c c]) [a a a b b b c c c] )
237
176
 
@@ -291,4 +230,4 @@
291
230
  (load "TinyLispFunctions.txt") loaded
292
231
  (tc -) false )
293
232
 
294
- (reset)
233
+ (reset)
@@ -12,7 +12,7 @@ the; a;)
12
12
  cat; dog;)
13
13
 
14
14
  (defcc <name1>
15
- -*- := (if (element? -*- [(protect Bill) (protect Ben)]) -*- (fail));)
15
+ X := X where (element? X [(protect Bill) (protect Ben)]);)
16
16
 
17
17
  (defcc <vp>
18
18
  <vtrans> <np>;)
@@ -44,19 +44,19 @@ NP VP -> (append [is it true that your father] VP [?]))
44
44
  (defcc <find-digit>
45
45
  <digit> <morestuff> := <digit>;
46
46
  <digit> := <digit>;
47
- -*- <find-digit> := <find-digit>;)
47
+ X <find-digit> := <find-digit>;)
48
48
 
49
49
  (defcc <morestuff>
50
- -*- <morestuff>;
51
- -*-;)
50
+ X <morestuff>;
51
+ X;)
52
52
 
53
53
  (defcc <digit>
54
54
  0; 1; 2; 3; 4; 5; 6; 7; 8; 9;)
55
55
 
56
56
  (defcc <find-digit'>
57
- <digit> <morestuff> := -s-;
58
- <digit> := -s-;
59
- -*- <find-digit'> := <find-digit'>;)
57
+ <digit> <morestuff>;
58
+ <digit> := <digit>;
59
+ X <find-digit'> := <find-digit'>;)
60
60
 
61
61
  (defcc <asbscs>
62
62
  <as> <bs> <cs>;)
@@ -85,18 +85,14 @@ b;
85
85
  (defcc <find-digit''>
86
86
  <digit''> <morestuff> := <digit''>;
87
87
  <digit''> := <digit''>;
88
- -*- <find-digit''> := <find-digit''>;)
88
+ X <find-digit''> := <find-digit''>;)
89
89
 
90
90
  (defcc <digit''>
91
- -*- := (one_of -*- [0 1 2 3 4 5 6 7 8 9]);)
92
-
93
- (define one_of
94
- X Y -> (if (element? X Y) X (fail)))
91
+ X := X where (element? X [0 1 2 3 4 5 6 7 8 9]);)
95
92
 
96
93
  (defcc <anbncn>
97
- <as> <bs> <cs> := (if (equal-length? [<as> <bs> <cs>])
98
- (appendall [<as> <bs> <cs>])
99
- (fail));)
94
+ <as> <bs> <cs> := (appendall [<as> <bs> <cs>])
95
+ where (equal-length? [<as> <bs> <cs>]);)
100
96
 
101
97
  (defcc <as>
102
98
  a <as>;
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shen-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-01-24 00:00:00.000000000 Z
13
+ date: 2013-03-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
@@ -29,7 +29,7 @@ dependencies:
29
29
  - !ruby/object:Gem::Version
30
30
  version: '2.12'
31
31
  description: ShenRuby is a port of the Shen programming language to Ruby. It currently
32
- supports Shen version 8.0.
32
+ supports Shen version 9.0.
33
33
  email:
34
34
  - greg@sourcematters.org
35
35
  executables:
@@ -39,18 +39,26 @@ extra_rdoc_files: []
39
39
  files:
40
40
  - .gitignore
41
41
  - .rspec
42
+ - .travis.yml
42
43
  - Gemfile
43
- - Gemfile.lock
44
44
  - HISTORY.md
45
45
  - MIT_LICENSE.txt
46
46
  - README.md
47
+ - Rakefile
47
48
  - bin/shen_test_suite.rb
48
49
  - bin/srrepl
49
50
  - k_lambda_spec/atom_spec.rb
51
+ - k_lambda_spec/primitives/arithmetic_spec.rb
52
+ - k_lambda_spec/primitives/assignments_spec.rb
50
53
  - k_lambda_spec/primitives/boolean_operations_spec.rb
51
54
  - k_lambda_spec/primitives/generic_functions_spec.rb
55
+ - k_lambda_spec/primitives/lists_spec.rb
56
+ - k_lambda_spec/primitives/strings_spec.rb
57
+ - k_lambda_spec/primitives/symbols_spec.rb
58
+ - k_lambda_spec/primitives/vectors_spec.rb
52
59
  - k_lambda_spec/spec_helper.rb
53
60
  - k_lambda_spec/support/shared_examples.rb
61
+ - k_lambda_spec/tail_recursion_spec.rb
54
62
  - lib/kl.rb
55
63
  - lib/kl/absvector.rb
56
64
  - lib/kl/compiler.rb
@@ -83,7 +91,6 @@ files:
83
91
  - shen/release/benchmarks/README.shen
84
92
  - shen/release/benchmarks/benchmarks.shen
85
93
  - shen/release/benchmarks/bigprog
86
- - shen/release/benchmarks/br.shen
87
94
  - shen/release/benchmarks/einstein.shen
88
95
  - shen/release/benchmarks/heatwave.gif
89
96
  - shen/release/benchmarks/interpreter.shen
@@ -135,6 +142,7 @@ files:
135
142
  - shen/release/test_programs/parser.shen
136
143
  - shen/release/test_programs/powerset.shen
137
144
  - shen/release/test_programs/prime.shen
145
+ - shen/release/test_programs/prolog.shen
138
146
  - shen/release/test_programs/proof_assistant.shen
139
147
  - shen/release/test_programs/proplog_version_1.shen
140
148
  - shen/release/test_programs/proplog_version_2.shen
@@ -182,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
182
190
  version: '0'
183
191
  requirements: []
184
192
  rubyforge_project:
185
- rubygems_version: 1.8.24
193
+ rubygems_version: 1.8.23
186
194
  signing_key:
187
195
  specification_version: 3
188
196
  summary: ShenRuby is a Ruby port of the Shen programming language
@@ -1,20 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- ZenTest (4.8.3)
5
- diff-lcs (1.1.3)
6
- rspec (2.12.0)
7
- rspec-core (~> 2.12.0)
8
- rspec-expectations (~> 2.12.0)
9
- rspec-mocks (~> 2.12.0)
10
- rspec-core (2.12.1)
11
- rspec-expectations (2.12.0)
12
- diff-lcs (~> 1.1.3)
13
- rspec-mocks (2.12.0)
14
-
15
- PLATFORMS
16
- ruby
17
-
18
- DEPENDENCIES
19
- ZenTest (~> 4.8.3)
20
- rspec (~> 2.12.0)
@@ -1,13 +0,0 @@
1
- (defcc <br>
2
- 40 <br> 41 <br$> := ok;
3
- <item> <br> := ok;
4
- <e> := ok;)
5
-
6
- (defcc <br$>
7
- <br> := ok;)
8
-
9
- (defcc <item>
10
- -*- := (if (element? -*- [40 41])
11
- (fail)
12
- ok);)
13
-