rubymotionlisp 1.0.13 → 1.0.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 39e0ad7494d397d7b81efa7a7944b2f5a9e67af9
4
- data.tar.gz: fa4a9db073a2a8980aa656214053471f70fa3237
3
+ metadata.gz: 5de6ce4210bcf029285a399dcdcbfcbfb9e694b0
4
+ data.tar.gz: aa4cf373497533635555b76d401d197dad8ab060
5
5
  SHA512:
6
- metadata.gz: b1e5b6777151826297e368fc1e0d0f86017f96f9d1b9d422883eb20994d3f3e8eab46cd05f0efbe48da7bea8de81795a7f9720a4081b70789fe955b1520d566c
7
- data.tar.gz: f7af412d0764290c28eb36e3b74c717db63cf148b7c203ed7a6caf27f196b11b36585e7c9773098eaaa81d528ffbd7d9a6585b46738398cb929a0f77d7d3f296
6
+ metadata.gz: ad066de387e6c61c70e5b27e3022f4690a6673aba8bc42f8323618d2d6b6f7f423fdc8b244973bc06d8528a29e6670ee8544c2b3f6a72f924f39213f081272c8
7
+ data.tar.gz: d7b568d0fdbc79539e9dbc91c380a4defd3e5bef226a2433728519c4f1702d77f5d7ead5b6c12d78796717b1f5fae95067cd1d51259c0ac6ebcc00950e552d3d
data/lib/rubylisp/atom.rb CHANGED
@@ -4,6 +4,10 @@ module Lisp
4
4
 
5
5
  attr_reader :value
6
6
 
7
+ def set_location(type, package, file, start, length)
8
+ end
9
+
10
+
7
11
  def lisp_object?
8
12
  true
9
13
  end
@@ -4,6 +4,10 @@ module Lisp
4
4
  include Enumerable
5
5
  attr_reader :car, :cdr
6
6
 
7
+ def set_location(type, package, file, start, length)
8
+ end
9
+
10
+
7
11
  def self.cons(a=nil, b=nil)
8
12
  b = nil if b.pair? && b.empty?
9
13
  ConsCell.new(a, b)
@@ -17,6 +21,197 @@ module Lisp
17
21
  def value
18
22
  self
19
23
  end
24
+
25
+ def set_car!(d)
26
+ @car = d
27
+ end
28
+
29
+ def lisp_object?
30
+ true
31
+ end
32
+
33
+ def set_cdr!(d)
34
+ @cdr = d
35
+ end
36
+
37
+
38
+ def set_nth!(n, d)
39
+ return nil if empty?
40
+ c = self
41
+ n.times {|i| c = c.cdr}
42
+ c.set_car!(d)
43
+ end
44
+
45
+
46
+ def empty?
47
+ @car.nil? && @cdr.nil?
48
+ end
49
+
50
+ def string?
51
+ false
52
+ end
53
+
54
+ def character?
55
+ false
56
+ end
57
+
58
+ def number?
59
+ false
60
+ end
61
+
62
+ def positive?
63
+ false
64
+ end
65
+
66
+ def zero?
67
+ false
68
+ end
69
+
70
+ def negative?
71
+ false
72
+ end
73
+
74
+ def symbol?
75
+ false
76
+ end
77
+
78
+ def primitive?
79
+ false
80
+ end
81
+
82
+ def special?
83
+ false
84
+ end
85
+
86
+ def function?
87
+ false
88
+ end
89
+
90
+ def macro?
91
+ false
92
+ end
93
+
94
+ def pair?
95
+ true
96
+ end
97
+
98
+ def list?
99
+ true
100
+ end
101
+
102
+ def frame?
103
+ false
104
+ end
105
+
106
+ def vector?
107
+ false
108
+ end
109
+
110
+ def eq?(other)
111
+ return true if empty? && (other.nil? || (other.pair? && other.empty?))
112
+ other.pair? && self == other
113
+ end
114
+
115
+ def eqv?(other)
116
+ return true if empty? && (other.nil? || (other.pair? && other.empty?))
117
+ other.pair? && self == other
118
+ end
119
+
120
+ def equal?(other)
121
+ return true if empty? && (other.nil? || (other.pair? && other.empty?))
122
+ return false unless other.pair?
123
+ @car.equal?(other.car) && @cdr.equal?(other.cdr)
124
+ end
125
+
126
+ def type
127
+ :pair
128
+ end
129
+
130
+ def to_s_helper
131
+ return "#{@car.to_s}" if @cdr.nil?
132
+ return "#{@car.to_s} . #{@cdr.to_s}" unless @cdr.pair?
133
+ "#{@car.to_s} #{@cdr.to_s_helper}"
134
+ end
135
+
136
+ def to_s
137
+ return "()" if self.empty?
138
+ return "'#{@cdr.car.to_s}" if @car.symbol? && @car.name == "quote"
139
+ return "{#{@cdr.to_s_helper}}" if @car.symbol? && @car.name == "make-frame"
140
+ return "#(#{@cdr.to_s_helper})" if @car.symbol? && @car.name == "make-vector"
141
+ return "(#{@car.to_s} . #{@cdr.to_s})" if !@cdr.nil? && !@cdr.pair?
142
+ return "(#{self.to_s_helper})"
143
+ end
144
+
145
+ def print_string_helper
146
+ @cdr.nil? ? "#{@car.print_string}" : "#{@car.print_string} #{@cdr.print_string_helper}"
147
+ end
148
+
149
+ def print_string
150
+ return "()" if self.empty?
151
+ return "'#{@cdr.car.print_string}" if @car.symbol? && @car.name == "quote"
152
+ return "{#{@cdr.print_string_helper}}" if @car.symbol? && @car.name == "make-frame"
153
+ return "#(#{@cdr.print_string_helper})" if @car.symbol? && @car.name == "make-vector"
154
+ return "(#{@car.print_string} . #{@cdr.print_string})" if !@cdr.nil? && !@cdr.pair?
155
+ return "(#{self.print_string_helper})"
156
+ end
157
+
158
+ def to_a
159
+ a = []
160
+ return a if empty?
161
+ c = self
162
+ until c.nil?
163
+ a << c.car
164
+ c = c.cdr
165
+ end
166
+ a
167
+ end
168
+
169
+ def each &block
170
+ return if empty?
171
+ c = self
172
+ if self.length > 0
173
+ until c.nil?
174
+ yield c.car
175
+ c = c.cdr
176
+ end
177
+ end
178
+ end
179
+
180
+ def self.array_to_list(cells, tail=nil)
181
+ return cons() if cells.empty? && tail.nil?
182
+ head = ConsCell.new
183
+ last_cell = head
184
+ (0...cells.length).each do |i|
185
+ new_cell = self.cons(cells[i], nil)
186
+ last_cell.set_cdr!(new_cell)
187
+ last_cell = new_cell
188
+ end
189
+ last_cell.set_cdr!(tail)
190
+ head.cdr
191
+ end
192
+
193
+ def traverse(path)
194
+ next_cell = self
195
+ path.chars.each do |p|
196
+ return nil if next_cell.nil? || !next_cell.pair?
197
+ next_cell = ((p == ?a) ? next_cell.car : next_cell.cdr)
198
+ end
199
+ next_cell
200
+ end
201
+
202
+ def method_missing(name, *args, &block)
203
+ if name[0] == ?c && name[-1] == ?r && (name[1..-2].chars.all? {|e| "ad".include?(e)})
204
+ self.traverse(name[1..-2].reverse)
205
+ else
206
+ super
207
+ end
208
+ end
209
+
210
+ def nth(n)
211
+ c = self
212
+ n.times {|i| c = c.cdr}
213
+ c.car
214
+ end
20
215
 
21
216
  def nth_tail(n)
22
217
  c = self
@@ -5,47 +5,37 @@ module Lisp
5
5
  def initialize
6
6
  end
7
7
 
8
- def make_number(str, pos)
9
- Lisp::Number.with_value(str.to_i).tap do |obj|
10
- obj.set_location(pos, str.length)
11
- end
8
+ def make_number(str)
9
+ Lisp::Number.with_value(str.to_i)
12
10
  end
13
11
 
14
12
  def make_hex_number(str)
15
- Lisp::Number.with_value(["0x", str].join.to_i(0)).tap do |obj|
16
- obj.set_location(pos, str.length)
17
- end
13
+ Lisp::Number.with_value(["0x", str].join.to_i(0))
18
14
  end
19
15
 
20
16
  def make_float(str)
21
- Lisp::Number.with_value(str.to_f).tap do |obj|
22
- obj.set_location(pos, str.length)
23
- end
17
+ Lisp::Number.with_value(str.to_f)
24
18
  end
25
19
 
26
20
  def make_string(str)
27
- Lisp::String.with_value(str).tap do |obj|
28
- obj.set_location(pos, str.length)
29
- end
21
+ Lisp::String.with_value(str)
30
22
  end
31
23
 
32
24
  def make_symbol(str)
33
- Lisp::Symbol.named(str).tap do |obj|
34
- obj.set_location(pos, str.length)
35
- end
25
+ Lisp::Symbol.named(str)
36
26
  end
37
27
 
38
28
  def make_character(ch)
39
- Lisp::Character.with_value(ch).tap do |obj|
40
- obj.set_location(pos, str.length)
41
- end
29
+ Lisp::Character.with_value(ch)
42
30
  end
43
31
 
44
- def parse_cons_cell(tokens)
45
- tok, lit = tokens.next_token
32
+ def parse_cons_cell(start_pos, tokens)
33
+ pos, tok, lit = tokens.next_token
46
34
  if tok == :RPAREN
47
35
  tokens.consume_token
48
- return Lisp::ConsCell.cons()
36
+ return Lisp::ConsCell.cons().tap do |obj|
37
+ obj.set_location(start_pos, pos - start_pos + 1) if @parse_for_debugging
38
+ end
49
39
  end
50
40
 
51
41
  car = nil
@@ -56,31 +46,39 @@ module Lisp
56
46
  tokens.consume_token
57
47
  cdr = self.parse_sexpr(tokens)
58
48
  return nil if tokens.next_token[0] == :EOF
59
- tok, lit = tokens.next_token
49
+ pos, tok, lit = tokens.next_token
60
50
  return Lisp::Debug.process_error("Expected ')' to follow a dotted tail on line #{tokens.line_number}", Lisp::EnvironmentFrame.global) if tok != :RPAREN
61
51
  tokens.consume_token
62
- return Lisp::ConsCell.array_to_list(cells, cdr)
52
+ return Lisp::ConsCell.array_to_list(cells, cdr).tap do |obj|
53
+ obj.set_location(start_pos, pos - start_pos + 1) if @parse_for_debugging
54
+ end
63
55
  else
64
56
  car = self.parse_sexpr(tokens)
65
57
  return Lisp::Debug.process_error("Unexpected EOF (expected ')') on line #{tokens.line_number}", Lisp::EnvironmentFrame.global) if tokens.next_token[0] == :EOF
66
58
  cells << car
67
59
  end
68
- tok, lit = tokens.next_token
60
+ pos, tok, lit = tokens.next_token
69
61
  end
70
62
 
71
63
  tokens.consume_token
72
- Lisp::ConsCell.array_to_list(cells)
64
+ Lisp::ConsCell.array_to_list(cells).tap do |obj|
65
+ obj.set_location(start_pos, pos - start_pos + 1) if @parse_for_debugging
66
+ end
73
67
  end
74
68
 
75
- def parse_frame(tokens, literal)
69
+ def parse_frame(start_pos, tokens, literal)
76
70
  m = {}
77
- tok, lit = tokens.next_token
71
+ pos, tok, lit = tokens.next_token
78
72
  if tok == :RBRACE
79
73
  tokens.consume_token
80
74
  if literal
81
- Lisp::Frame.new
75
+ Lisp::Frame.new.tap do |obj|
76
+ obj.set_location(start_pos, pos - start_pos + 1) if @parse_for_debugging
77
+ end
82
78
  else
83
- Lisp::ConsCell.cons(Lisp::Symbol.named("make-frame"), nil)
79
+ Lisp::ConsCell.cons(Lisp::Symbol.named("make-frame"), nil).tap do |obj|
80
+ obj.set_location(start_pos, pos - start_pos + 1) if @parse_for_debugging
81
+ end
84
82
  end
85
83
  else
86
84
  cells = []
@@ -88,29 +86,37 @@ module Lisp
88
86
  item = self.parse_sexpr(tokens)
89
87
  return Lisp::Debug.process_error("Unexpected EOF (expected '}') on line #{tokens.line_number}", env) if tokens.next_token[0] == :EOF
90
88
  cells << item
91
- tok, lit = tokens.next_token
89
+ pos, tok, lit = tokens.next_token
92
90
  end
93
91
 
94
92
  tokens.consume_token
95
93
  keys_and_values = Lisp::ConsCell.array_to_list(cells)
96
94
  if literal
97
- Lisp::PrimFrame.make_frame_impl(keys_and_values, Lisp::EnvironmentFrame.global)
95
+ Lisp::PrimFrame.make_frame_impl(keys_and_values, Lisp::EnvironmentFrame.global).tap do |obj|
96
+ obj.set_location(start_pos, pos - start_pos + 1) if @parse_for_debugging
97
+ end
98
98
  else
99
- Lisp::ConsCell.cons(Lisp::Symbol.named("make-frame"), keys_and_values)
99
+ Lisp::ConsCell.cons(Lisp::Symbol.named("make-frame"), keys_and_values).tap do |obj|
100
+ obj.set_location(start_pos, pos - start_pos + 1) if @parse_for_debugging
101
+ end
100
102
  end
101
103
  end
102
104
  end
103
105
 
104
106
 
105
- def parse_vector(tokens, literal)
107
+ def parse_vector(start_pos, tokens, literal)
106
108
  v = []
107
- tok, lit = tokens.next_token
109
+ pos, tok, lit = tokens.next_token
108
110
  if tok == :RPAREN
109
111
  tokens.consume_token
110
112
  if literal
111
- Lisp::Vector.new
113
+ Lisp::Vector.new.tap do |obj|
114
+ obj.set_location(start_pos, pos - start_pos + 1) if @parse_for_debugging
115
+ end
112
116
  else
113
- Lisp::ConsCell.cons(Lis::Symbol.named("vector"), nil)
117
+ Lisp::ConsCell.cons(Lis::Symbol.named("vector"), nil).tap do |obj|
118
+ obj.set_location(start_pos, pos - start_pos + 1) if @parse_for_debugging
119
+ end
114
120
  end
115
121
  else
116
122
  cells = []
@@ -118,15 +124,19 @@ module Lisp
118
124
  item = self.parse_sexpr(tokens)
119
125
  return Lisp::Debug.process_error("Unexpected EOF (expected ')') on line #{tokens.line_number}", env) if tokens.next_token[0] == :EOF
120
126
  cells << item
121
- tok, lit = tokens.next_token
127
+ pos, tok, lit = tokens.next_token
122
128
  end
123
129
 
124
130
  tokens.consume_token
125
131
 
126
132
  if literal
127
- Lisp::Vector.with_array(cells)
133
+ Lisp::Vector.with_array(cells).tap do |obj|
134
+ obj.set_location(start_pos, pos - start_pos + 1) if @parse_for_debugging
135
+ end
128
136
  else
129
- Lisp::ConsCell.cons(Lisp::Symbol.named("vector"), Lisp::ConsCell.array_to_list(cells))
137
+ Lisp::ConsCell.cons(Lisp::Symbol.named("vector"), Lisp::ConsCell.array_to_list(cells)).tap do |obj|
138
+ obj.set_location(start_pos, pos - start_pos + 1) if @parse_for_debugging
139
+ end
130
140
  end
131
141
  end
132
142
  end
@@ -134,7 +144,7 @@ module Lisp
134
144
 
135
145
  def parse_sexpr(tokens)
136
146
  while true
137
- tok, lit = tokens.next_token
147
+ pos, tok, lit = tokens.next_token
138
148
  # puts "token: <#{tok}, #{lit}>"
139
149
  return nil if tok == :EOF
140
150
  tokens.consume_token
@@ -162,15 +172,15 @@ module Lisp
162
172
  obj.set_location(pos, lit.length) if @parse_for_debugging
163
173
  end
164
174
  when :LPAREN
165
- return parse_cons_cell(tokens)
175
+ return parse_cons_cell(pos, tokens)
166
176
  when :LBRACE
167
- return parse_frame(tokens, false)
177
+ return parse_frame(pos, tokens, false)
168
178
  when :QUOTE_LBRACE
169
- return parse_frame(tokens, true)
179
+ return parse_frame(pos, tokens, true)
170
180
  when :HASH_LPAREN
171
- return parse_vector(tokens, false)
181
+ return parse_vector(pos, tokens, false)
172
182
  when :QUOTE_HASH_LPAREN
173
- return parse_vector(tokens, true)
183
+ return parse_vector(pos, tokens, true)
174
184
  when :SYMBOL
175
185
  return make_symbol(lit).tap do |obj|
176
186
  obj.set_location(pos, lit.length) if @parse_for_debugging
@@ -15,6 +15,7 @@ module Lisp
15
15
  def initialize(src, absorb_space=true)
16
16
  @absorb_whitespace = absorb_space
17
17
  @source = src
18
+ @position = 0
18
19
  @lookahead_token = nil
19
20
  @lookahead_literal = ''
20
21
  @eof = false
@@ -112,7 +113,7 @@ module Lisp
112
113
  end
113
114
 
114
115
  tok ||= :SYMBOL
115
- return @position, tok, case tok
116
+ return tok, case tok
116
117
  when :SYMBOL, :FFI_STATIC_SYMBOL
117
118
  lit
118
119
  when :FFI_SEND_SYMBOL
@@ -143,7 +144,7 @@ module Lisp
143
144
  :NUMBER
144
145
  end
145
146
 
146
- return @position, tok, lit
147
+ return tok, lit
147
148
  end
148
149
 
149
150
 
@@ -183,9 +184,9 @@ module Lisp
183
184
  advance
184
185
  end
185
186
 
186
- return @position, :EOF, '' if eof?
187
+ return :EOF, '' if eof?
187
188
  advance
188
- return @position, :STRING, process_escapes(lit)
189
+ return :STRING, process_escapes(lit)
189
190
  end
190
191
 
191
192
 
@@ -203,27 +204,26 @@ module Lisp
203
204
  advance
204
205
  end
205
206
 
206
- return @position, :CHARACTER, lit
207
+ return :CHARACTER, lit
207
208
  end
208
209
 
209
210
 
210
211
  def read_next_token
211
- @position = @source.pos
212
-
213
- return @position, :EOF, '' if eof?
212
+ return :EOF, '' if eof?
214
213
 
215
214
  if @absorb_whitespace
216
215
  while space?(@current_ch)
217
216
  @line_number += 1 if @current_ch == "\n"
218
217
  advance
219
- return @position, :EOF, '' if eof?
218
+ @position = @source.pos
219
+ return :EOF, '' if eof?
220
220
  end
221
221
  end
222
222
 
223
223
  if !@absorb_whitespace && space?(@current_ch)
224
224
  @line_number += 1 if @current_ch == "\n"
225
225
  advance
226
- return @position, :WHITESPACE, " "
226
+ return :WHITESPACE, " "
227
227
  elsif number?(@current_ch)
228
228
  return read_number(false)
229
229
  elsif @current_ch == '-' && number?(@next_ch)
@@ -242,50 +242,50 @@ module Lisp
242
242
  elsif @current_ch == '\'' && @next_ch == '{'
243
243
  advance
244
244
  advance
245
- return @position, :QUOTE_LBRACE, "'{"
245
+ return :QUOTE_LBRACE, "'{"
246
246
  elsif @current_ch == '\'' && @next_ch == '#' && @next_next_ch == '('
247
247
  advance
248
248
  advance
249
249
  advance
250
- return @position, :QUOTE_HASH_LPAREN, "'#("
250
+ return :QUOTE_HASH_LPAREN, "'#("
251
251
  elsif @current_ch == '\''
252
252
  advance
253
- return @position, :QUOTE, "'"
253
+ return :QUOTE, "'"
254
254
  elsif @current_ch == '`'
255
255
  advance
256
- return @position, :BACKQUOTE, "`"
256
+ return :BACKQUOTE, "`"
257
257
  elsif @current_ch == ',' && @next_ch == '@'
258
258
  advance
259
259
  advance
260
- return @position, :COMMAAT, ",@"
260
+ return :COMMAAT, ",@"
261
261
  elsif @current_ch == ','
262
262
  advance
263
- return @position, :COMMA, ","
263
+ return :COMMA, ","
264
264
  elsif @current_ch == '('
265
265
  advance
266
- return @position, :LPAREN, "("
266
+ return :LPAREN, "("
267
267
  elsif @current_ch == '#' && @next_ch == '('
268
268
  advance
269
269
  advance
270
- return @position, :HASH_LPAREN, "#("
270
+ return :HASH_LPAREN, "#("
271
271
  elsif @current_ch == ')'
272
272
  advance
273
- return @position, :@position, RPAREN, ")"
273
+ return :RPAREN, ")"
274
274
  elsif @current_ch == '{'
275
275
  advance
276
- regturn @position, :LBRACE, "{"
276
+ return :LBRACE, "{"
277
277
  elsif @current_ch == '}'
278
278
  advance
279
- return @position, :RBRACE, "}"
279
+ return :RBRACE, "}"
280
280
  elsif @current_ch == '['
281
281
  advance
282
- return @position, :LBRACKET, "["
282
+ return :LBRACKET, "["
283
283
  elsif @current_ch == ']'
284
284
  advance
285
- return @position, :RBRACKET, "]"
285
+ return :RBRACKET, "]"
286
286
  elsif @current_ch == '.' && space?(@next_ch)
287
287
  advance
288
- return @position, :PERIOD, "."
288
+ return :PERIOD, "."
289
289
  elsif @current_ch == '.' && symbol_character?(@next_ch)
290
290
  return read_symbol
291
291
  elsif symbol_character?(@current_ch)
@@ -293,24 +293,25 @@ module Lisp
293
293
  elsif @current_ch == '#' && @next_ch == 't'
294
294
  advance
295
295
  advance
296
- return @position, :TRUE, "#t"
296
+ return :TRUE, "#t"
297
297
  elsif @current_ch == '#' && @next_ch == 'f'
298
298
  advance
299
299
  advance
300
- return @position, :FALSE, "#f"
300
+ return :FALSE, "#f"
301
301
  elsif @current_ch == ';'
302
302
  lit = ""
303
303
  while true
304
- return @position, :COMMENT, lit if eof? || @current_ch == "\n"
304
+ return :COMMENT, lit if eof? || @current_ch == "\n"
305
305
  lit << @current_ch
306
306
  advance
307
307
  end
308
308
  else
309
- return @position, :ILLEGAL, @current_ch
309
+ return :ILLEGAL, @current_ch
310
310
  end
311
311
  end
312
312
 
313
313
  def consume_token
314
+ @position = @source.pos
314
315
  @lookahead_token, @lookahead_literal = self.read_next_token
315
316
  consume_token if @lookahead_token == :COMMENT
316
317
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubymotionlisp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.13
4
+ version: 1.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dave Astels
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-12 00:00:00.000000000 Z
11
+ date: 2016-03-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: An embeddable Lisp as an extension language for RubyMotion
14
14
  email: dastels@icloud.com