shen-ruby 0.1.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 (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,149 @@
1
+ require 'spec_helper'
2
+
3
+ describe Kl::Lexer do
4
+ def lexer(str)
5
+ Kl::Lexer.new(StringIO.new(str))
6
+ end
7
+
8
+ describe 'syntax tokens' do
9
+ it 'reads ( as a Kl::Lexer::OpenParen' do
10
+ lexer("(").next.should be_kind_of Kl::Lexer::OpenParen
11
+ end
12
+
13
+ it 'reads ) as a Kl::Lexer::CloseParen' do
14
+ lexer(")").next.should be_kind_of Kl::Lexer::CloseParen
15
+ end
16
+ end
17
+
18
+ describe 'string tokens' do
19
+ it 'reads double-quoted strings' do
20
+ lexer('"Fred"').next.should == "Fred"
21
+ end
22
+
23
+ it 'throws Kl::Error on unterminated strings' do
24
+ expect {
25
+ lexer('"Fred').next
26
+ }.to raise_error(Kl::Error, "unterminated string")
27
+ end
28
+ end
29
+
30
+ describe 'symbols' do
31
+ it 'reads sign characters not followed by digits as symbols' do
32
+ lexer('-').next.should == '-'.to_sym
33
+ lexer('+').next.should == '+'.to_sym
34
+ lexer('--+-').next.should == '--+-'.to_sym
35
+ end
36
+
37
+ it 'reads double decimal points followed by digits as symbols' do
38
+ lexer('..77').next.should == '..77'.to_sym
39
+ end
40
+
41
+ it "accepts =-*/+_?$!@~><&%'#`;:{} in symbols" do
42
+ all_punctuation = "=-*/+_?$!@~><&%'#`;:{}"
43
+ sym = lexer(all_punctuation).next
44
+ sym.should be_kind_of Symbol
45
+ sym.to_s.should == all_punctuation
46
+ end
47
+ end
48
+
49
+ describe 'numbers' do
50
+ it 'reads integers as Fixnums' do
51
+ num = lexer("37").next
52
+ num.should be_kind_of Fixnum
53
+ num.should == 37
54
+ end
55
+
56
+ it 'reads floating points as Floats' do
57
+ num = lexer("37.42").next
58
+ num.should be_kind_of Float
59
+ num.should == 37.42
60
+ end
61
+
62
+ it 'with an odd number of leading minuses are negative' do
63
+ lexer('-1').next.should == -1
64
+ lexer('---1').next.should == -1
65
+ end
66
+
67
+ it 'with an even number of leading minuses are positive' do
68
+ lexer('--1').next.should == 1
69
+ lexer('----1').next.should == 1
70
+ end
71
+
72
+ it 'with leading + does not change sign' do
73
+ lexer('+-1').next.should == -1
74
+ lexer('-+--1').next.should == -1
75
+ lexer('-+-+1').next.should == 1
76
+ lexer('+-+-+-+-+1').next.should == 1
77
+ end
78
+
79
+ it 'allows leading decimal points' do
80
+ lexer('.9').next.should == 0.9
81
+ lexer('-.9').next.should == -0.9
82
+ end
83
+
84
+ it 'treats a trailing decimal followed by EOF as a symbol' do
85
+ l = lexer('7.')
86
+ num = l.next
87
+ num.should be_kind_of Fixnum
88
+ num.should == 7
89
+
90
+ sym = l.next
91
+ sym.should be_kind_of Symbol
92
+ sym.to_s.should == '.'
93
+ end
94
+
95
+ it 'treats a trailing decimal followed by non-digit as a symbol' do
96
+ l = lexer('7.a')
97
+ num = l.next
98
+ num.should be_kind_of Fixnum
99
+ num.should == 7
100
+
101
+ sym = l.next
102
+ sym.should be_kind_of Symbol
103
+ sym.to_s.should == '.a'
104
+ end
105
+
106
+ it 'handles multiple decimal points like shen does' do
107
+ l = lexer('7.8.9')
108
+ l.next.should == 7.8
109
+ l.next.should == 0.9
110
+ end
111
+ end
112
+
113
+ describe 'booleans' do
114
+ it 'reads true as boolean true' do
115
+ lexer('true').next.should be_kind_of TrueClass
116
+ end
117
+
118
+ it 'reads false as boolean false' do
119
+ lexer('false').next.should be_kind_of FalseClass
120
+ end
121
+ end
122
+
123
+ describe 'whitespace' do
124
+ it 'is ignored between tokens' do
125
+ l = lexer(" (\n\t) ")
126
+ l.next.should be_kind_of Kl::Lexer::OpenParen
127
+ l.next.should be_kind_of Kl::Lexer::CloseParen
128
+ l.next.should be_nil
129
+ end
130
+
131
+ it 'is left intact in strings' do
132
+ lexer(' "one two" ').next.should == "one two"
133
+ end
134
+ end
135
+
136
+ it 'works with these all together' do
137
+ l = lexer('(12 quick m-*$ RAN `fast\' -.7) "oh 12 yeah!" ')
138
+ l.next.should be_kind_of Kl::Lexer::OpenParen
139
+ l.next.should == 12
140
+ l.next.should == :quick
141
+ l.next.should == 'm-*$'.to_sym
142
+ l.next.should == :RAN
143
+ l.next.should == "`fast'".to_sym
144
+ l.next.should == -0.7
145
+ l.next.should be_kind_of Kl::Lexer::CloseParen
146
+ l.next.should == "oh 12 yeah!"
147
+ l.next.should be_nil
148
+ end
149
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'kl/primitives/generic_functions'
3
+
4
+ describe Kl::Primitives::GenericFunctions do
5
+ include Kl::Primitives::GenericFunctions
6
+
7
+ describe '=' do
8
+ it 'works as expected for numbers' do
9
+ self.send("=", 1, 1).should be_true
10
+ self.send("=", 1, 1.0).should be_true
11
+ self.send("=", 1, 2).should be_false
12
+ end
13
+
14
+ it 'works as expected for symbols' do
15
+ self.send("=", :a, :a).should be_true
16
+ self.send("=", :"big-bad!", :"big-bad!").should be_true
17
+ self.send("=", :"big-bad!", :wolf).should be_false
18
+ end
19
+
20
+ it 'works as expected for lists' do
21
+ self.send("=", Kl::Cons.list([1, 2]), Kl::Cons.list([1, 2])).
22
+ should be_true
23
+ self.send("=", Kl::EmptyList.instance, Kl::EmptyList.instance).
24
+ should be_true
25
+ self.send("=", Kl::Cons.list([1, 3]), Kl::Cons.list([1, 2])).
26
+ should be_false
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+ require 'kl/primitives/symbols'
3
+
4
+ describe Kl::Primitives::Symbols do
5
+ include Kl::Primitives::Symbols
6
+
7
+ describe "intern" do
8
+ it "returns boolean true for 'true'" do
9
+ intern("true").should == true
10
+ end
11
+
12
+ it "returns boolean false for 'false'" do
13
+ intern("false").should == false
14
+ end
15
+
16
+ it "returns the symbol corresponding to the string otherwise" do
17
+ intern("abc-123").should == :"abc-123"
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Kl::Reader do
4
+ def reader(str)
5
+ Kl::Reader.new(StringIO.new(str))
6
+ end
7
+
8
+ describe 'Reading lists' do
9
+ it 'reads () as an empty list' do
10
+ reader('()').next.should be_kind_of Kl::EmptyList
11
+ end
12
+
13
+ it 'reads a list as a single expression' do
14
+ list = reader('(1 2 3)').next
15
+ list.should == Kl::Cons.list([1, 2, 3])
16
+ end
17
+
18
+ it 'supports nested lists' do
19
+ list = reader('(1 (2 (3) ()))').next
20
+ list.should == Kl::Cons.list([1,
21
+ Kl::Cons.list([2,
22
+ Kl::Cons.list([3]),
23
+ Kl::EmptyList.instance])])
24
+ end
25
+ end
26
+
27
+ describe 'Reading booleans' do
28
+ it 'reads true as true' do
29
+ reader('true').next.should == true
30
+ end
31
+
32
+ it 'reads false as false' do
33
+ reader('false').next.should == false
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,2 @@
1
+ require 'kl'
2
+ require 'stringio'
metadata ADDED
@@ -0,0 +1,189 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shen-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Greg Spurrier
9
+ - Mark Tarver
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-12-31 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: '2.12'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ version: '2.12'
31
+ description: ShenRuby is a port of the Shen programming language to Ruby. It currently
32
+ supports Shen version 7.1.
33
+ email:
34
+ - greg@sourcematters.org
35
+ executables:
36
+ - srrepl
37
+ extensions: []
38
+ extra_rdoc_files: []
39
+ files:
40
+ - .gitignore
41
+ - .rspec
42
+ - Gemfile
43
+ - Gemfile.lock
44
+ - MIT_LICENSE.txt
45
+ - README.md
46
+ - bin/shen_test_suite.rb
47
+ - bin/srrepl
48
+ - lib/kl.rb
49
+ - lib/kl/absvector.rb
50
+ - lib/kl/compiler.rb
51
+ - lib/kl/cons.rb
52
+ - lib/kl/empty_list.rb
53
+ - lib/kl/environment.rb
54
+ - lib/kl/error.rb
55
+ - lib/kl/internal_error.rb
56
+ - lib/kl/lexer.rb
57
+ - lib/kl/primitives/arithmetic.rb
58
+ - lib/kl/primitives/assignments.rb
59
+ - lib/kl/primitives/booleans.rb
60
+ - lib/kl/primitives/error_handling.rb
61
+ - lib/kl/primitives/generic_functions.rb
62
+ - lib/kl/primitives/lists.rb
63
+ - lib/kl/primitives/streams.rb
64
+ - lib/kl/primitives/strings.rb
65
+ - lib/kl/primitives/symbols.rb
66
+ - lib/kl/primitives/time.rb
67
+ - lib/kl/primitives/vectors.rb
68
+ - lib/kl/reader.rb
69
+ - lib/kl/trampoline.rb
70
+ - lib/shen_ruby.rb
71
+ - lib/shen_ruby/version.rb
72
+ - shen-ruby.gemspec
73
+ - shen/README.txt
74
+ - shen/lib/shen_ruby/shen.rb
75
+ - shen/license.txt
76
+ - shen/release/benchmarks/N_queens.shen
77
+ - shen/release/benchmarks/README.shen
78
+ - shen/release/benchmarks/benchmarks.shen
79
+ - shen/release/benchmarks/bigprog
80
+ - shen/release/benchmarks/br.shen
81
+ - shen/release/benchmarks/einstein.shen
82
+ - shen/release/benchmarks/heatwave.gif
83
+ - shen/release/benchmarks/interpreter.shen
84
+ - shen/release/benchmarks/picture.jpg
85
+ - shen/release/benchmarks/plato.jpg
86
+ - shen/release/benchmarks/powerset.shen
87
+ - shen/release/benchmarks/prime.shen
88
+ - shen/release/benchmarks/short.shen
89
+ - shen/release/benchmarks/text.txt
90
+ - shen/release/k_lambda/core.kl
91
+ - shen/release/k_lambda/declarations.kl
92
+ - shen/release/k_lambda/load.kl
93
+ - shen/release/k_lambda/macros.kl
94
+ - shen/release/k_lambda/prolog.kl
95
+ - shen/release/k_lambda/reader.kl
96
+ - shen/release/k_lambda/sequent.kl
97
+ - shen/release/k_lambda/sys.kl
98
+ - shen/release/k_lambda/t-star.kl
99
+ - shen/release/k_lambda/toplevel.kl
100
+ - shen/release/k_lambda/track.kl
101
+ - shen/release/k_lambda/types.kl
102
+ - shen/release/k_lambda/writer.kl
103
+ - shen/release/k_lambda/yacc.kl
104
+ - shen/release/test_programs/Chap13/problems.txt
105
+ - shen/release/test_programs/README.shen
106
+ - shen/release/test_programs/TinyLispFunctions.txt
107
+ - shen/release/test_programs/TinyTypes.shen
108
+ - shen/release/test_programs/binary.shen
109
+ - shen/release/test_programs/bubble_version_1.shen
110
+ - shen/release/test_programs/bubble_version_2.shen
111
+ - shen/release/test_programs/calculator.shen
112
+ - shen/release/test_programs/cartprod.shen
113
+ - shen/release/test_programs/change.shen
114
+ - shen/release/test_programs/classes-defaults.shen
115
+ - shen/release/test_programs/classes-inheritance.shen
116
+ - shen/release/test_programs/classes-typed.shen
117
+ - shen/release/test_programs/classes-untyped.shen
118
+ - shen/release/test_programs/depth_.shen
119
+ - shen/release/test_programs/einstein.shen
120
+ - shen/release/test_programs/fruit_machine.shen
121
+ - shen/release/test_programs/interpreter.shen
122
+ - shen/release/test_programs/metaprog.shen
123
+ - shen/release/test_programs/minim.shen
124
+ - shen/release/test_programs/mutual.shen
125
+ - shen/release/test_programs/n_queens.shen
126
+ - shen/release/test_programs/newton_version_1.shen
127
+ - shen/release/test_programs/newton_version_2.shen
128
+ - shen/release/test_programs/parse.prl
129
+ - shen/release/test_programs/parser.shen
130
+ - shen/release/test_programs/powerset.shen
131
+ - shen/release/test_programs/prime.shen
132
+ - shen/release/test_programs/proof_assistant.shen
133
+ - shen/release/test_programs/proplog_version_1.shen
134
+ - shen/release/test_programs/proplog_version_2.shen
135
+ - shen/release/test_programs/qmachine.shen
136
+ - shen/release/test_programs/red-black.shen
137
+ - shen/release/test_programs/search.shen
138
+ - shen/release/test_programs/semantic_net.shen
139
+ - shen/release/test_programs/spreadsheet.shen
140
+ - shen/release/test_programs/stack.shen
141
+ - shen/release/test_programs/streams.shen
142
+ - shen/release/test_programs/strings.shen
143
+ - shen/release/test_programs/structures-typed.shen
144
+ - shen/release/test_programs/structures-untyped.shen
145
+ - shen/release/test_programs/tests.shen
146
+ - shen/release/test_programs/types.shen
147
+ - shen/release/test_programs/whist.shen
148
+ - shen/release/test_programs/yacc.shen
149
+ - spec/kl/cons_spec.rb
150
+ - spec/kl/environment_spec.rb
151
+ - spec/kl/lexer_spec.rb
152
+ - spec/kl/primitives/generic_functions_spec.rb
153
+ - spec/kl/primitives/symbols_spec.rb
154
+ - spec/kl/reader_spec.rb
155
+ - spec/spec_helper.rb
156
+ homepage: https://github.com/gregspurrier/shen-ruby
157
+ licenses:
158
+ - Shen License and MIT License. See README.md for details.
159
+ post_install_message:
160
+ rdoc_options: []
161
+ require_paths:
162
+ - lib
163
+ - shen/lib
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ none: false
166
+ requirements:
167
+ - - ! '>='
168
+ - !ruby/object:Gem::Version
169
+ version: 1.9.3
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ requirements: []
177
+ rubyforge_project:
178
+ rubygems_version: 1.8.24
179
+ signing_key:
180
+ specification_version: 3
181
+ summary: ShenRuby is a Ruby port of the Shen programming language
182
+ test_files:
183
+ - spec/kl/cons_spec.rb
184
+ - spec/kl/environment_spec.rb
185
+ - spec/kl/lexer_spec.rb
186
+ - spec/kl/primitives/generic_functions_spec.rb
187
+ - spec/kl/primitives/symbols_spec.rb
188
+ - spec/kl/reader_spec.rb
189
+ - spec/spec_helper.rb