shen-ruby 0.10.0 → 0.11.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/.rspec +1 -0
- data/.travis.yml +9 -3
- data/Gemfile +1 -4
- data/HISTORY.md +16 -0
- data/MIT_LICENSE.txt +1 -1
- data/README.md +25 -26
- data/Rakefile +3 -11
- data/bin/shen_test_suite.rb +15 -3
- data/bin/srrepl +6 -8
- data/lib/shen_ruby.rb +6 -1
- data/lib/shen_ruby/converters.rb +23 -0
- data/lib/shen_ruby/version.rb +1 -1
- data/shen-ruby.gemspec +4 -1
- data/shen/lib/shen_ruby/shen.rb +49 -33
- data/shen/release/benchmarks/N_queens.shen +45 -45
- data/shen/release/benchmarks/README.shen +14 -14
- data/shen/release/benchmarks/benchmarks.shen +52 -52
- data/shen/release/benchmarks/einstein.shen +32 -32
- data/shen/release/benchmarks/interpreter.shen +219 -219
- data/shen/release/benchmarks/jnk.shen +193 -193
- data/shen/release/benchmarks/powerset.shen +10 -10
- data/shen/release/benchmarks/prime.shen +10 -10
- data/shen/release/benchmarks/short.shen +129 -129
- data/shen/release/k_lambda/core.kl +181 -181
- data/shen/release/k_lambda/declarations.kl +131 -131
- data/shen/release/k_lambda/load.kl +84 -84
- data/shen/release/k_lambda/macros.kl +112 -112
- data/shen/release/k_lambda/prolog.kl +252 -252
- data/shen/release/k_lambda/reader.kl +222 -222
- data/shen/release/k_lambda/sequent.kl +166 -166
- data/shen/release/k_lambda/sys.kl +271 -271
- data/shen/release/k_lambda/t-star.kl +139 -139
- data/shen/release/k_lambda/toplevel.kl +135 -135
- data/shen/release/k_lambda/track.kl +103 -103
- data/shen/release/k_lambda/types.kl +324 -324
- data/shen/release/k_lambda/writer.kl +105 -105
- data/shen/release/k_lambda/yacc.kl +113 -113
- 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
- data/spec/shen_ruby/converters_spec.rb +48 -0
- data/spec/spec_helper.rb +1 -2
- metadata +55 -60
- data/k_lambda_spec/atom_spec.rb +0 -85
- data/k_lambda_spec/primitives/arithmetic_spec.rb +0 -175
- data/k_lambda_spec/primitives/assignments_spec.rb +0 -44
- data/k_lambda_spec/primitives/boolean_operations_spec.rb +0 -136
- data/k_lambda_spec/primitives/generic_functions_spec.rb +0 -120
- data/k_lambda_spec/primitives/lists_spec.rb +0 -40
- data/k_lambda_spec/primitives/strings_spec.rb +0 -77
- data/k_lambda_spec/primitives/symbols_spec.rb +0 -24
- data/k_lambda_spec/primitives/vectors_spec.rb +0 -92
- data/k_lambda_spec/spec_helper.rb +0 -29
- data/k_lambda_spec/support/shared_examples.rb +0 -124
- data/k_lambda_spec/tail_recursion_spec.rb +0 -30
- data/lib/kl.rb +0 -7
- data/lib/kl/absvector.rb +0 -12
- data/lib/kl/compiler.rb +0 -360
- data/lib/kl/cons.rb +0 -51
- data/lib/kl/empty_list.rb +0 -12
- data/lib/kl/environment.rb +0 -163
- data/lib/kl/error.rb +0 -4
- data/lib/kl/internal_error.rb +0 -7
- data/lib/kl/lexer.rb +0 -186
- data/lib/kl/primitives/arithmetic.rb +0 -60
- data/lib/kl/primitives/assignments.rb +0 -15
- data/lib/kl/primitives/booleans.rb +0 -21
- data/lib/kl/primitives/error_handling.rb +0 -13
- data/lib/kl/primitives/extensions.rb +0 -12
- data/lib/kl/primitives/generic_functions.rb +0 -29
- data/lib/kl/primitives/lists.rb +0 -23
- data/lib/kl/primitives/streams.rb +0 -28
- data/lib/kl/primitives/strings.rb +0 -63
- data/lib/kl/primitives/symbols.rb +0 -18
- data/lib/kl/primitives/time.rb +0 -17
- data/lib/kl/primitives/vectors.rb +0 -36
- data/lib/kl/reader.rb +0 -46
- data/spec/kl/cons_spec.rb +0 -12
- data/spec/kl/environment_spec.rb +0 -282
- data/spec/kl/interop_spec.rb +0 -68
- data/spec/kl/lexer_spec.rb +0 -149
- data/spec/kl/primitives/generic_functions_spec.rb +0 -29
- data/spec/kl/primitives/symbols_spec.rb +0 -21
- data/spec/kl/reader_spec.rb +0 -42
data/spec/kl/lexer_spec.rb
DELETED
@@ -1,149 +0,0 @@
|
|
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
|
@@ -1,29 +0,0 @@
|
|
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
|
@@ -1,21 +0,0 @@
|
|
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
|
-
|
data/spec/kl/reader_spec.rb
DELETED
@@ -1,42 +0,0 @@
|
|
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
|
-
|
26
|
-
it 'raises an error on unterminated lists' do
|
27
|
-
expect {
|
28
|
-
reader('(1').next
|
29
|
-
}.to raise_error(Kl::Error, 'Unterminated list')
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe 'Reading booleans' do
|
34
|
-
it 'reads true as true' do
|
35
|
-
reader('true').next.should == true
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'reads false as false' do
|
39
|
-
reader('false').next.should == false
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|