shen-ruby 0.3.1 → 0.4.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.
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
-