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.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +9 -3
  4. data/Gemfile +1 -4
  5. data/HISTORY.md +16 -0
  6. data/MIT_LICENSE.txt +1 -1
  7. data/README.md +25 -26
  8. data/Rakefile +3 -11
  9. data/bin/shen_test_suite.rb +15 -3
  10. data/bin/srrepl +6 -8
  11. data/lib/shen_ruby.rb +6 -1
  12. data/lib/shen_ruby/converters.rb +23 -0
  13. data/lib/shen_ruby/version.rb +1 -1
  14. data/shen-ruby.gemspec +4 -1
  15. data/shen/lib/shen_ruby/shen.rb +49 -33
  16. data/shen/release/benchmarks/N_queens.shen +45 -45
  17. data/shen/release/benchmarks/README.shen +14 -14
  18. data/shen/release/benchmarks/benchmarks.shen +52 -52
  19. data/shen/release/benchmarks/einstein.shen +32 -32
  20. data/shen/release/benchmarks/interpreter.shen +219 -219
  21. data/shen/release/benchmarks/jnk.shen +193 -193
  22. data/shen/release/benchmarks/powerset.shen +10 -10
  23. data/shen/release/benchmarks/prime.shen +10 -10
  24. data/shen/release/benchmarks/short.shen +129 -129
  25. data/shen/release/k_lambda/core.kl +181 -181
  26. data/shen/release/k_lambda/declarations.kl +131 -131
  27. data/shen/release/k_lambda/load.kl +84 -84
  28. data/shen/release/k_lambda/macros.kl +112 -112
  29. data/shen/release/k_lambda/prolog.kl +252 -252
  30. data/shen/release/k_lambda/reader.kl +222 -222
  31. data/shen/release/k_lambda/sequent.kl +166 -166
  32. data/shen/release/k_lambda/sys.kl +271 -271
  33. data/shen/release/k_lambda/t-star.kl +139 -139
  34. data/shen/release/k_lambda/toplevel.kl +135 -135
  35. data/shen/release/k_lambda/track.kl +103 -103
  36. data/shen/release/k_lambda/types.kl +324 -324
  37. data/shen/release/k_lambda/writer.kl +105 -105
  38. data/shen/release/k_lambda/yacc.kl +113 -113
  39. data/shen/release/test_programs/Chap13/problems.txt +26 -26
  40. data/shen/release/test_programs/README.shen +52 -52
  41. data/shen/release/test_programs/TinyLispFunctions.txt +15 -15
  42. data/shen/release/test_programs/TinyTypes.shen +55 -55
  43. data/shen/release/test_programs/binary.shen +24 -24
  44. data/shen/release/test_programs/bubble_version_1.shen +28 -28
  45. data/shen/release/test_programs/bubble_version_2.shen +22 -22
  46. data/shen/release/test_programs/calculator.shen +21 -21
  47. data/shen/release/test_programs/cartprod.shen +23 -23
  48. data/shen/release/test_programs/change.shen +25 -25
  49. data/shen/release/test_programs/classes-defaults.shen +94 -94
  50. data/shen/release/test_programs/classes-inheritance.shen +100 -100
  51. data/shen/release/test_programs/classes-typed.shen +74 -74
  52. data/shen/release/test_programs/classes-untyped.shen +46 -46
  53. data/shen/release/test_programs/depth_.shen +14 -14
  54. data/shen/release/test_programs/einstein.shen +34 -34
  55. data/shen/release/test_programs/fruit_machine.shen +46 -46
  56. data/shen/release/test_programs/interpreter.shen +217 -217
  57. data/shen/release/test_programs/metaprog.shen +85 -85
  58. data/shen/release/test_programs/minim.shen +192 -192
  59. data/shen/release/test_programs/mutual.shen +11 -11
  60. data/shen/release/test_programs/n_queens.shen +45 -45
  61. data/shen/release/test_programs/newton_version_1.shen +33 -33
  62. data/shen/release/test_programs/newton_version_2.shen +24 -24
  63. data/shen/release/test_programs/parse.prl +14 -14
  64. data/shen/release/test_programs/parser.shen +51 -51
  65. data/shen/release/test_programs/powerset.shen +10 -10
  66. data/shen/release/test_programs/prime.shen +10 -10
  67. data/shen/release/test_programs/prolog.shen +78 -78
  68. data/shen/release/test_programs/proof_assistant.shen +80 -80
  69. data/shen/release/test_programs/proplog_version_1.shen +25 -25
  70. data/shen/release/test_programs/proplog_version_2.shen +27 -27
  71. data/shen/release/test_programs/qmachine.shen +66 -66
  72. data/shen/release/test_programs/red-black.shen +54 -54
  73. data/shen/release/test_programs/search.shen +55 -55
  74. data/shen/release/test_programs/semantic_net.shen +44 -44
  75. data/shen/release/test_programs/spreadsheet.shen +34 -34
  76. data/shen/release/test_programs/stack.shen +27 -27
  77. data/shen/release/test_programs/streams.shen +20 -20
  78. data/shen/release/test_programs/strings.shen +57 -57
  79. data/shen/release/test_programs/structures-typed.shen +71 -71
  80. data/shen/release/test_programs/structures-untyped.shen +41 -41
  81. data/shen/release/test_programs/tests.shen +232 -232
  82. data/shen/release/test_programs/types.shen +11 -11
  83. data/shen/release/test_programs/whist.shen +239 -239
  84. data/shen/release/test_programs/yacc.shen +132 -132
  85. data/spec/shen_ruby/converters_spec.rb +48 -0
  86. data/spec/spec_helper.rb +1 -2
  87. metadata +55 -60
  88. data/k_lambda_spec/atom_spec.rb +0 -85
  89. data/k_lambda_spec/primitives/arithmetic_spec.rb +0 -175
  90. data/k_lambda_spec/primitives/assignments_spec.rb +0 -44
  91. data/k_lambda_spec/primitives/boolean_operations_spec.rb +0 -136
  92. data/k_lambda_spec/primitives/generic_functions_spec.rb +0 -120
  93. data/k_lambda_spec/primitives/lists_spec.rb +0 -40
  94. data/k_lambda_spec/primitives/strings_spec.rb +0 -77
  95. data/k_lambda_spec/primitives/symbols_spec.rb +0 -24
  96. data/k_lambda_spec/primitives/vectors_spec.rb +0 -92
  97. data/k_lambda_spec/spec_helper.rb +0 -29
  98. data/k_lambda_spec/support/shared_examples.rb +0 -124
  99. data/k_lambda_spec/tail_recursion_spec.rb +0 -30
  100. data/lib/kl.rb +0 -7
  101. data/lib/kl/absvector.rb +0 -12
  102. data/lib/kl/compiler.rb +0 -360
  103. data/lib/kl/cons.rb +0 -51
  104. data/lib/kl/empty_list.rb +0 -12
  105. data/lib/kl/environment.rb +0 -163
  106. data/lib/kl/error.rb +0 -4
  107. data/lib/kl/internal_error.rb +0 -7
  108. data/lib/kl/lexer.rb +0 -186
  109. data/lib/kl/primitives/arithmetic.rb +0 -60
  110. data/lib/kl/primitives/assignments.rb +0 -15
  111. data/lib/kl/primitives/booleans.rb +0 -21
  112. data/lib/kl/primitives/error_handling.rb +0 -13
  113. data/lib/kl/primitives/extensions.rb +0 -12
  114. data/lib/kl/primitives/generic_functions.rb +0 -29
  115. data/lib/kl/primitives/lists.rb +0 -23
  116. data/lib/kl/primitives/streams.rb +0 -28
  117. data/lib/kl/primitives/strings.rb +0 -63
  118. data/lib/kl/primitives/symbols.rb +0 -18
  119. data/lib/kl/primitives/time.rb +0 -17
  120. data/lib/kl/primitives/vectors.rb +0 -36
  121. data/lib/kl/reader.rb +0 -46
  122. data/spec/kl/cons_spec.rb +0 -12
  123. data/spec/kl/environment_spec.rb +0 -282
  124. data/spec/kl/interop_spec.rb +0 -68
  125. data/spec/kl/lexer_spec.rb +0 -149
  126. data/spec/kl/primitives/generic_functions_spec.rb +0 -29
  127. data/spec/kl/primitives/symbols_spec.rb +0 -21
  128. data/spec/kl/reader_spec.rb +0 -42
@@ -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
-
@@ -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