nydp 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.zeiger.yml +28 -0
- data/lib/lisp/core-000.nydp +1 -1
- data/lib/lisp/core-015-documentation.nydp +6 -9
- data/lib/lisp/core-017-builtin-dox.nydp +33 -0
- data/lib/lisp/core-025-warnings.nydp +15 -0
- data/lib/lisp/core-030-syntax.nydp +38 -2
- data/lib/lisp/core-035-flow-control.nydp +2 -2
- data/lib/lisp/core-037-list-utils.nydp +7 -5
- data/lib/lisp/core-040-utils.nydp +15 -4
- data/lib/lisp/core-043-list-utils.nydp +1 -0
- data/lib/lisp/core-045-dox-utils.nydp +6 -0
- data/lib/lisp/core-050-test-runner.nydp +9 -9
- data/lib/lisp/core-070-prefix-list.nydp +2 -2
- data/lib/lisp/core-090-hook.nydp +24 -0
- data/lib/lisp/core-100-utils.nydp +38 -10
- data/lib/lisp/tests/ampersand-syntax-examples.nydp +26 -0
- data/lib/lisp/tests/boot-tests.nydp +1 -1
- data/lib/lisp/tests/collect-tests.nydp +4 -0
- data/lib/lisp/tests/destructuring-examples.nydp +18 -1
- data/lib/lisp/tests/fill-bucket-examples.nydp +46 -2
- data/lib/lisp/tests/floor-examples.nydp +58 -0
- data/lib/lisp/tests/k-examples.nydp +5 -0
- data/lib/lisp/tests/power-examples.nydp +16 -0
- data/lib/lisp/tests/string-tests.nydp +8 -0
- data/lib/lisp/tests/syntax-tests.nydp +6 -0
- data/lib/lisp/tests/zip-examples.nydp +16 -0
- data/lib/nydp.rb +6 -2
- data/lib/nydp/assignment.rb +1 -2
- data/lib/nydp/builtin/ensuring.rb +1 -2
- data/lib/nydp/builtin/greater_than.rb +2 -2
- data/lib/nydp/builtin/handle_error.rb +1 -2
- data/lib/nydp/builtin/less_than.rb +2 -2
- data/lib/nydp/builtin/math_ceiling.rb +7 -0
- data/lib/nydp/builtin/math_floor.rb +7 -0
- data/lib/nydp/builtin/math_power.rb +7 -0
- data/lib/nydp/builtin/math_round.rb +7 -0
- data/lib/nydp/builtin/parse.rb +2 -2
- data/lib/nydp/builtin/parse_in_string.rb +3 -3
- data/lib/nydp/builtin/pre_compile.rb +0 -1
- data/lib/nydp/compiler.rb +1 -1
- data/lib/nydp/cond.rb +3 -6
- data/lib/nydp/context_symbol.rb +40 -32
- data/lib/nydp/core.rb +8 -2
- data/lib/nydp/function_invocation.rb +3 -5
- data/lib/nydp/image_store.rb +21 -0
- data/lib/nydp/interpreted_function.rb +8 -12
- data/lib/nydp/lexical_context_builder.rb +19 -35
- data/lib/nydp/pair.rb +2 -1
- data/lib/nydp/parser.rb +4 -0
- data/lib/nydp/plugin.rb +15 -8
- data/lib/nydp/runner.rb +3 -3
- data/lib/nydp/symbol.rb +3 -1
- data/lib/nydp/symbol_lookup.rb +2 -2
- data/lib/nydp/truth.rb +2 -2
- data/lib/nydp/version.rb +1 -1
- data/lib/nydp/vm.rb +47 -27
- data/spec/date_spec.rb +2 -2
- data/spec/embedded_spec.rb +16 -16
- data/spec/error_spec.rb +1 -1
- data/spec/nydp_spec.rb +13 -4
- data/spec/parser_spec.rb +63 -16
- data/spec/spec_helper.rb +1 -2
- data/spec/string_atom_spec.rb +2 -2
- data/spec/symbol_spec.rb +2 -2
- data/spec/tokeniser_spec.rb +101 -0
- metadata +16 -2
data/lib/nydp/compiler.rb
CHANGED
@@ -40,7 +40,7 @@ module Nydp
|
|
40
40
|
def self.compile_pair expression, bindings
|
41
41
|
key = expression.car
|
42
42
|
if sym?(key, :cond)
|
43
|
-
Cond.build expression.cdr, bindings
|
43
|
+
Cond.build expression.cdr, bindings # todo: replace with function? (cond x (fn () iftrue) (fn () iffalse)) -->> performance issues, creating two closures for every cond invocation
|
44
44
|
elsif sym?(key, :quote)
|
45
45
|
Literal.build expression.cadr, bindings
|
46
46
|
elsif sym?(key, :assign)
|
data/lib/nydp/cond.rb
CHANGED
@@ -28,8 +28,7 @@ module Nydp
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def execute vm
|
31
|
-
vm.
|
32
|
-
vm.contexts.push vm.current_context
|
31
|
+
vm.push_ctx_instructions conditional
|
33
32
|
condition.execute vm
|
34
33
|
end
|
35
34
|
|
@@ -78,8 +77,7 @@ module Nydp
|
|
78
77
|
class Cond_LEX < CondBase
|
79
78
|
def execute vm
|
80
79
|
truth = !Nydp::NIL.is?(@condition.value vm.current_context)
|
81
|
-
vm.
|
82
|
-
vm.contexts.push vm.current_context
|
80
|
+
vm.push_ctx_instructions (truth ? @when_true : @when_false)
|
83
81
|
end
|
84
82
|
|
85
83
|
def self.build cond, when_true, when_false
|
@@ -171,8 +169,7 @@ module Nydp
|
|
171
169
|
|
172
170
|
class Cond_SYM < CondBase
|
173
171
|
def execute vm
|
174
|
-
vm.
|
175
|
-
vm.contexts.push vm.current_context
|
172
|
+
vm.push_ctx_instructions (Nydp::NIL.is?(@condition.value) ? @when_false : @when_true)
|
176
173
|
end
|
177
174
|
end
|
178
175
|
end
|
data/lib/nydp/context_symbol.rb
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
module Nydp
|
2
2
|
class ContextSymbol
|
3
|
-
def self.
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
def self.const_missing const
|
4
|
+
if const.to_s =~ /^ContextSymbol_\d+_\d+$/
|
5
|
+
name = const.to_s.split(/_/)
|
6
|
+
define_klass(const, name[1].to_i, name[2].to_i)
|
7
|
+
const_get const
|
8
|
+
else
|
9
|
+
super(const)
|
10
|
+
end
|
11
|
+
end
|
8
12
|
|
13
|
+
def self.define_klass name, depth, binding_index
|
9
14
|
getctx = ([".parent"] * depth).join
|
10
15
|
at_index = if binding_index < 10
|
11
16
|
"at_#{binding_index}"
|
@@ -19,34 +24,37 @@ module Nydp
|
|
19
24
|
"set_index(#{binding_index}, value)"
|
20
25
|
end
|
21
26
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
27
|
+
code = <<-KLASS
|
28
|
+
def initialize name
|
29
|
+
@name = name
|
30
|
+
end
|
31
|
+
|
32
|
+
def value ctx
|
33
|
+
ctx#{getctx}.#{at_index} || Nydp::NIL
|
34
|
+
end
|
35
|
+
|
36
|
+
def assign value, ctx
|
37
|
+
ctx#{getctx}.#{set_index}
|
38
|
+
rescue StandardError => e
|
39
|
+
raise "problem in \#{self.class.name}#assign, name is \#{@name}, depth is \#{depth}, index is #{binding_index}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute vm
|
43
|
+
vm.push_arg value vm.current_context
|
44
|
+
end
|
45
|
+
|
46
|
+
def depth ; #{depth} ; end
|
47
|
+
def inspect ; to_s ; end
|
48
|
+
def to_s ; "[#{depth}##{binding_index}]\#{@name}" ; end
|
49
|
+
KLASS
|
50
|
+
|
51
|
+
const_set name, Class.new(Nydp::ContextSymbol) {
|
52
|
+
eval code
|
53
|
+
}
|
54
|
+
end
|
47
55
|
|
48
|
-
|
49
|
-
const_get(
|
56
|
+
def self.build depth, name, binding_index
|
57
|
+
const_get(:"ContextSymbol_#{depth}_#{binding_index}").new(name)
|
50
58
|
end
|
51
59
|
end
|
52
60
|
end
|
data/lib/nydp/core.rb
CHANGED
@@ -71,8 +71,14 @@ module Nydp
|
|
71
71
|
Symbol.mk(:"hash-key?", ns).assign(Nydp::Builtin::HashKeyPresent.instance)
|
72
72
|
Symbol.mk(:"hash-merge", ns).assign(Nydp::Builtin::HashMerge.instance)
|
73
73
|
Symbol.mk(:"vm-info", ns).assign Nydp::Builtin::VmInfo.instance
|
74
|
-
Symbol.mk(:"pre-compile", ns).assign Nydp::Builtin::PreCompile.instance
|
75
|
-
Symbol.mk(:"script-run"
|
74
|
+
Symbol.mk(:"pre-compile" , ns).assign Nydp::Builtin::PreCompile.instance
|
75
|
+
Symbol.mk(:"script-run" , ns).assign Nydp::Builtin::ScriptRun.instance
|
76
|
+
Symbol.mk(:"**" , ns).assign Nydp::Builtin::MathPower.instance
|
77
|
+
Symbol.mk(:"⌊" , ns).assign Nydp::Builtin::MathFloor.instance
|
78
|
+
Symbol.mk(:"math-floor" , ns).assign Nydp::Builtin::MathFloor.instance
|
79
|
+
Symbol.mk(:"⌈" , ns).assign Nydp::Builtin::MathCeiling.instance
|
80
|
+
Symbol.mk(:"math-ceiling", ns).assign Nydp::Builtin::MathCeiling.instance
|
81
|
+
Symbol.mk(:"math-round" , ns).assign Nydp::Builtin::MathRound.instance
|
76
82
|
end
|
77
83
|
end
|
78
84
|
end
|
@@ -24,7 +24,7 @@ module Nydp
|
|
24
24
|
raise
|
25
25
|
else
|
26
26
|
if e.is_a?(NoMethodError) && !f.respond_to?(invoker)
|
27
|
-
raise InvocationFailed.new("#{f} is not a function")
|
27
|
+
raise InvocationFailed.new("#{f.inspect} is not a function: args were #{args.inspect}")
|
28
28
|
else
|
29
29
|
msg = args.map { |a| " #{a.inspect}"}.join("\n")
|
30
30
|
msg = "failed to execute invocation #{f.inspect}\n#{msg}"
|
@@ -323,10 +323,8 @@ module Nydp
|
|
323
323
|
|
324
324
|
def execute vm
|
325
325
|
## Invocation.sig @sig
|
326
|
-
vm.
|
327
|
-
vm.
|
328
|
-
vm.instructions.push argument_instructions
|
329
|
-
vm.contexts .push vm.current_context
|
326
|
+
vm.push_ctx_instructions function_instruction
|
327
|
+
vm.push_ctx_instructions argument_instructions
|
330
328
|
end
|
331
329
|
|
332
330
|
def inspect ; @source.inspect ; end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'digest'
|
2
|
+
|
3
|
+
module Nydp
|
4
|
+
class ImageStore
|
5
|
+
attr_accessor :store
|
6
|
+
|
7
|
+
def initialize store=nil
|
8
|
+
@store = store
|
9
|
+
FileUtils.mkdir_p(store, mode: 0775) if store
|
10
|
+
end
|
11
|
+
|
12
|
+
def digest ; Digest::MD5.hexdigest(Nydp.all_files.map { |f| File.read f }.join) ; end
|
13
|
+
def file_name id ; File.join @store, "#{id}.nydp_image" ; end
|
14
|
+
def load? fname ; File.binread(fname) if File.exists?(fname) ; end
|
15
|
+
def load id ; load?(file_name id) if @store ; end
|
16
|
+
def store id, image ; File.open(file_name(id), "wb") { |f| f.write(image) } if @store ; end
|
17
|
+
def generate id ; Marshal.dump(::Nydp.build_nydp).tap { |im| store id, im } ; end
|
18
|
+
def resurrect id ; load(id) || generate(id) ; end
|
19
|
+
def get ; Marshal.load(@image ||= resurrect(digest)) ; end
|
20
|
+
end
|
21
|
+
end
|
@@ -10,41 +10,37 @@ module Nydp
|
|
10
10
|
end
|
11
11
|
|
12
12
|
class InterpretedFunction
|
13
|
+
NIL = Nydp::NIL
|
13
14
|
include Helper
|
14
15
|
extend Helper
|
15
16
|
|
16
17
|
attr_accessor :arg_names, :body, :context_builder
|
17
18
|
|
18
19
|
def invoke_1 vm, parent_context
|
19
|
-
vm.
|
20
|
-
vm.contexts.push set_args_0 parent_context
|
20
|
+
vm.push_instructions self.body, set_args_0(parent_context)
|
21
21
|
end
|
22
22
|
|
23
23
|
def invoke_2 vm, parent_context, arg
|
24
|
-
vm.
|
25
|
-
vm.contexts.push set_args_1(parent_context, arg)
|
24
|
+
vm.push_instructions self.body, set_args_1(parent_context, arg)
|
26
25
|
end
|
27
26
|
|
28
27
|
def invoke_3 vm, parent_context, arg_0, arg_1
|
29
|
-
vm.
|
30
|
-
vm.contexts.push set_args_2(parent_context, arg_0, arg_1)
|
28
|
+
vm.push_instructions self.body, set_args_2(parent_context, arg_0, arg_1)
|
31
29
|
end
|
32
30
|
|
33
31
|
def invoke_4 vm, parent_context, arg_0, arg_1, arg_2
|
34
|
-
vm.
|
35
|
-
vm.contexts.push set_args_3(parent_context, arg_0, arg_1, arg_2)
|
32
|
+
vm.push_instructions self.body, set_args_3(parent_context, arg_0, arg_1, arg_2)
|
36
33
|
end
|
37
34
|
|
38
35
|
def invoke vm, parent_context, arg_values
|
39
|
-
vm.
|
40
|
-
vm.contexts.push set_args(parent_context, arg_values)
|
36
|
+
vm.push_instructions self.body, set_args(parent_context, arg_values)
|
41
37
|
end
|
42
38
|
|
43
39
|
def setup_context context, names, values
|
44
40
|
if pair? names
|
45
41
|
context.set names.car, values.car
|
46
42
|
setup_context context, names.cdr, values.cdr
|
47
|
-
elsif
|
43
|
+
elsif NIL != names
|
48
44
|
context.set names, values
|
49
45
|
end
|
50
46
|
end
|
@@ -75,7 +71,7 @@ module Nydp
|
|
75
71
|
if pair? arg_list
|
76
72
|
index_parameters arg_list.car, hsh
|
77
73
|
index_parameters arg_list.cdr, hsh
|
78
|
-
elsif
|
74
|
+
elsif NIL != arg_list
|
79
75
|
hsh[arg_list] = hsh.size
|
80
76
|
end
|
81
77
|
end
|
@@ -1,6 +1,17 @@
|
|
1
1
|
module Nydp::LexicalContextBuilder
|
2
2
|
extend Nydp::Helper
|
3
3
|
|
4
|
+
def self.const_missing(const)
|
5
|
+
if const.to_s =~ /^B_\d+(_Rest)?$/
|
6
|
+
name = const.to_s.split(/_/)
|
7
|
+
size = name[1].to_i
|
8
|
+
name[2] ? build_builder_rest_class(const, size) : build_builder_class(const, size)
|
9
|
+
const_get const
|
10
|
+
else
|
11
|
+
super(const)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
4
15
|
def self.mklc nexpected
|
5
16
|
(nexpected > 0) ? "lc = Nydp::LexicalContext.new lc\n " : ""
|
6
17
|
end
|
@@ -70,40 +81,20 @@ module Nydp::LexicalContextBuilder
|
|
70
81
|
"
|
71
82
|
end
|
72
83
|
|
73
|
-
def self.
|
74
|
-
name
|
75
|
-
|
76
|
-
return name if existing
|
84
|
+
def self.define_module name, code
|
85
|
+
const_set name.to_sym, Module.new { eval code }
|
86
|
+
end
|
77
87
|
|
88
|
+
def self.build_builder_class name, expected_arg_count
|
78
89
|
n_methods = (0..3).map { |given| build_set_args_n_method given, expected_arg_count }
|
79
90
|
x_method = build_set_args_method expected_arg_count
|
80
|
-
|
81
|
-
module #{name}
|
82
|
-
#{n_methods.join "\n"}
|
83
|
-
#{x_method}
|
84
|
-
end
|
85
|
-
KLASS
|
86
|
-
|
87
|
-
eval klass
|
88
|
-
name
|
91
|
+
define_module name, "#{n_methods.join "\n"}\n#{x_method}"
|
89
92
|
end
|
90
93
|
|
91
|
-
def self.
|
92
|
-
name = "B_#{proper_arg_count}_Rest"
|
93
|
-
existing = const_get(name) rescue nil
|
94
|
-
return name if existing
|
95
|
-
|
94
|
+
def self.build_builder_rest_class name, proper_arg_count
|
96
95
|
n_methods = (0..3).map { |given| build_set_args_n_rest_method given, proper_arg_count }
|
97
96
|
x_method = build_set_args_rest_method proper_arg_count
|
98
|
-
|
99
|
-
module #{name}
|
100
|
-
#{n_methods.join "\n"}
|
101
|
-
#{x_method}
|
102
|
-
end
|
103
|
-
KLASS
|
104
|
-
|
105
|
-
eval klass
|
106
|
-
name
|
97
|
+
define_module name, "#{n_methods.join "\n"}\n#{x_method}"
|
107
98
|
end
|
108
99
|
|
109
100
|
def self.select arg_names
|
@@ -114,13 +105,6 @@ KLASS
|
|
114
105
|
size = 0
|
115
106
|
proper = Nydp::NIL.is? arg_names
|
116
107
|
end
|
117
|
-
|
118
|
-
if proper
|
119
|
-
class_name = get_builder_class size
|
120
|
-
else
|
121
|
-
class_name = get_builder_rest_class size
|
122
|
-
end
|
123
|
-
|
124
|
-
self.const_get(class_name.to_sym)
|
108
|
+
const_get(proper ? :"B_#{size}" : :"B_#{size}_Rest")
|
125
109
|
end
|
126
110
|
end
|
data/lib/nydp/pair.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
class Nydp::Pair
|
2
|
+
NIL = Nydp::NIL
|
2
3
|
include Nydp::Helper, Enumerable
|
3
4
|
extend Nydp::Helper
|
4
5
|
|
@@ -51,7 +52,7 @@ class Nydp::Pair
|
|
51
52
|
end
|
52
53
|
|
53
54
|
def == other
|
54
|
-
|
55
|
+
(NIL != other) && (other.respond_to? :car) && (self.car == other.car) && (self.cdr == other.cdr)
|
55
56
|
end
|
56
57
|
|
57
58
|
def proper?
|
data/lib/nydp/parser.rb
CHANGED
@@ -121,6 +121,10 @@ module Nydp
|
|
121
121
|
INTERPOLATION_SIGN = /~/
|
122
122
|
INTERPOLATION_ESCAPES = { /~\s/ => true, /~~/ => "~" }
|
123
123
|
|
124
|
+
def embedded token_stream
|
125
|
+
string token_stream, "", :eof
|
126
|
+
end
|
127
|
+
|
124
128
|
def string token_stream, open_delimiter, close_delimiter
|
125
129
|
fragments = [sym(:"string-pieces")]
|
126
130
|
string_token = token_stream.next_string_fragment(open_delimiter, close_delimiter, INTERPOLATION_SIGN, INTERPOLATION_ESCAPES)
|
data/lib/nydp/plugin.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
|
+
require 'nydp/image_store'
|
2
|
+
|
1
3
|
module Nydp
|
2
4
|
PLUGINS = []
|
5
|
+
@@image_store = Nydp::ImageStore.new
|
3
6
|
|
4
|
-
def self.plug_in
|
5
|
-
def self.load_rake_tasks; PLUGINS.each &:load_rake_tasks ; end
|
6
|
-
def self.setup
|
7
|
-
def self.loadfiles;
|
8
|
-
def self.testfiles;
|
9
|
-
def self.plugin_names
|
7
|
+
def self.plug_in plugin ; PLUGINS << plugin ; end
|
8
|
+
def self.load_rake_tasks ; PLUGINS.each &:load_rake_tasks ; end
|
9
|
+
def self.setup ns ; PLUGINS.each { |plg| plg.setup ns } ; end
|
10
|
+
def self.loadfiles ; PLUGINS.map(&:loadfiles).flatten ; end
|
11
|
+
def self.testfiles ; PLUGINS.map(&:testfiles).flatten ; end
|
12
|
+
def self.plugin_names ; PLUGINS.map(&:name) ; end
|
10
13
|
def self.loadall ns, plugin, files
|
11
14
|
vm = VM.new(ns)
|
12
15
|
apply_function ns, :"script-run", :"plugin-start", plugin.name if plugin
|
@@ -20,14 +23,18 @@ module Nydp
|
|
20
23
|
apply_function ns, :"script-run", :"plugin-end", plugin.name if plugin
|
21
24
|
end
|
22
25
|
|
23
|
-
def self.
|
26
|
+
def self.all_files ; PLUGINS.each_with_object([]) { |plg, list| plg.loadfiles.each { |f| list << f } } ; end
|
27
|
+
def self.set_image_store store ; @@image_store = store ; end
|
28
|
+
|
29
|
+
def self.get_nydp ; @@image_store.get ; end
|
30
|
+
|
31
|
+
def self.build_nydp &block
|
24
32
|
ns = Namespace.new
|
25
33
|
setup(ns)
|
26
34
|
PLUGINS.each { |plg|
|
27
35
|
loadall ns, plg, plg.loadfiles, &block
|
28
36
|
loadall ns, plg, plg.testfiles, &block
|
29
37
|
}
|
30
|
-
loadall ns, nil, extra_files, &block if extra_files
|
31
38
|
ns
|
32
39
|
end
|
33
40
|
end
|
data/lib/nydp/runner.rb
CHANGED
@@ -49,7 +49,7 @@ module Nydp
|
|
49
49
|
|
50
50
|
def compile_and_eval expr
|
51
51
|
begin
|
52
|
-
vm.
|
52
|
+
vm.thread_with_expr Pair.new(Compiler.compile(expr, Nydp::NIL), Nydp::NIL)
|
53
53
|
rescue StandardError => e
|
54
54
|
raise Nydp::Error, "failed to eval #{expr.inspect}"
|
55
55
|
end
|
@@ -68,8 +68,8 @@ module Nydp
|
|
68
68
|
def initialize vm, ns, stream, printer=nil, name=nil
|
69
69
|
super vm, ns, name
|
70
70
|
@printer = printer
|
71
|
-
@parser = Nydp
|
72
|
-
@tokens = Nydp
|
71
|
+
@parser = Nydp.new_parser(ns)
|
72
|
+
@tokens = Nydp.new_tokeniser stream
|
73
73
|
end
|
74
74
|
|
75
75
|
def print val
|
data/lib/nydp/symbol.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
class Nydp::Symbol
|
2
|
+
class Unbound < StandardError ; end
|
3
|
+
|
2
4
|
EMPTY = :""
|
3
5
|
attr_accessor :name
|
4
6
|
attr_reader :hash
|
@@ -15,7 +17,7 @@ class Nydp::Symbol
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def value context=nil
|
18
|
-
raise
|
20
|
+
raise Unbound.new("unbound symbol: #{self.inspect}") if @value == nil
|
19
21
|
@value
|
20
22
|
end
|
21
23
|
|
data/lib/nydp/symbol_lookup.rb
CHANGED
@@ -5,7 +5,7 @@ module Nydp
|
|
5
5
|
extend Helper
|
6
6
|
|
7
7
|
def self.skip_empty bindings
|
8
|
-
while
|
8
|
+
while (NIL != bindings) && bindings.car.empty?
|
9
9
|
bindings = bindings.cdr
|
10
10
|
end
|
11
11
|
bindings
|
@@ -14,7 +14,7 @@ module Nydp
|
|
14
14
|
def self.build name, bindings
|
15
15
|
bindings = skip_empty bindings
|
16
16
|
depth = 0
|
17
|
-
while
|
17
|
+
while NIL != bindings
|
18
18
|
here = bindings.car
|
19
19
|
if here.key? name
|
20
20
|
binding_index = here[name]
|