nydp 0.2.1 → 0.2.2
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/lib/lisp/core-012-utils.nydp +3 -4
- data/lib/lisp/core-015-documentation.nydp +11 -10
- data/lib/lisp/core-017-builtin-dox.nydp +1 -1
- data/lib/lisp/core-040-utils.nydp +34 -7
- data/lib/lisp/core-050-test-runner.nydp +2 -2
- data/lib/lisp/core-060-benchmarking.nydp +62 -8
- data/lib/lisp/core-080-pretty-print.nydp +131 -78
- data/lib/lisp/tests/boot-tests.nydp +8 -0
- data/lib/lisp/tests/intersperse-examples.nydp +57 -0
- data/lib/lisp/tests/invocation-tests.nydp +60 -10
- data/lib/lisp/tests/list-tests.nydp +14 -1
- data/lib/lisp/tests/pretty-print-tests.nydp +274 -15
- data/lib/lisp/tests/sort-examples.nydp +3 -1
- data/lib/nydp/compiler.rb +2 -1
- data/lib/nydp/context_symbol.rb +38 -43
- data/lib/nydp/function_invocation.rb +70 -0
- data/lib/nydp/lexical_context.rb +39 -59
- data/lib/nydp/lexical_context_builder.rb +84 -176
- data/lib/nydp/symbol.rb +5 -1
- data/lib/nydp/symbol_lookup.rb +2 -24
- data/lib/nydp/version.rb +1 -1
- metadata +3 -2
@@ -15,7 +15,9 @@
|
|
15
15
|
("sorts a list of hashes by a specified key"
|
16
16
|
(let hh (list { a 1 b 2 } { a 7 b 9 } { a 3 b 1 } { a 2 b 8 })
|
17
17
|
(pp (sort-by &a hh)))
|
18
|
-
"({ a 1 b 2 } { a 2 b 8 }
|
18
|
+
"({ a 1 b 2 } { a 2 b 8 }
|
19
|
+
{ a 3 b 1 }
|
20
|
+
{ a 7 b 9 })")
|
19
21
|
|
20
22
|
("sorts a list of strings according to their length"
|
21
23
|
(sort-by len
|
data/lib/nydp/compiler.rb
CHANGED
@@ -10,7 +10,8 @@ module Nydp
|
|
10
10
|
def self.compile expression, bindings
|
11
11
|
compile_expr expression, bindings
|
12
12
|
rescue Exception => e
|
13
|
-
|
13
|
+
new_msg = "failed to compile expression #{expression.inspect},\nerror was #{e.message}"
|
14
|
+
raise $!, new_msg, $!.backtrace
|
14
15
|
end
|
15
16
|
|
16
17
|
def self.compile_expr expression, bindings
|
data/lib/nydp/context_symbol.rb
CHANGED
@@ -1,54 +1,49 @@
|
|
1
1
|
module Nydp
|
2
|
-
class ContextLookup0 ; def self.get_context ctx; ctx; end; end
|
3
|
-
class ContextLookup1 ; def self.get_context ctx; ctx.parent; end; end
|
4
|
-
class ContextLookup2 ; def self.get_context ctx; ctx.parent.parent; end; end
|
5
|
-
class ContextLookup3 ; def self.get_context ctx; ctx.parent.parent.parent; end; end
|
6
|
-
class ContextLookup4 ; def self.get_context ctx; ctx.parent.parent.parent.parent; end; end
|
7
|
-
class ContextLookup5 ; def self.get_context ctx; ctx.parent.parent.parent.parent.parent; end; end
|
8
|
-
class ContextLookup6 ; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent; end; end
|
9
|
-
class ContextLookup7 ; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent; end; end
|
10
|
-
class ContextLookup8 ; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent.parent; end; end
|
11
|
-
class ContextLookup9 ; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent.parent.parent; end; end
|
12
|
-
class ContextLookup10; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent; end; end
|
13
|
-
class ContextLookup11; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent; end; end
|
14
|
-
class ContextLookup12; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent; end; end
|
15
|
-
class ContextLookup13; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent; end; end
|
16
|
-
class ContextLookup14; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent; end; end
|
17
|
-
class ContextLookup15; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent; end; end
|
18
|
-
class ContextLookup16; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent; end; end
|
19
|
-
class ContextLookup17; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent; end; end
|
20
|
-
class ContextLookup18; def self.get_context ctx; ctx.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent; end; end
|
21
|
-
class ContextLookupN
|
22
|
-
def initialize depth ; @depth = depth ; end
|
23
|
-
def get_context ctx ; ctx.nth(@depth) ; end
|
24
|
-
end
|
25
|
-
|
26
2
|
class ContextSymbol
|
27
|
-
|
3
|
+
def self.build depth, name, binding_index
|
4
|
+
cname = "ContextSymbol_#{depth}_#{binding_index}"
|
28
5
|
|
29
|
-
|
30
|
-
|
31
|
-
@depth, @name, @binding_index = depth, name, binding_index
|
32
|
-
end
|
6
|
+
existing = const_get(cname) rescue nil
|
7
|
+
return existing.new(name) if existing
|
33
8
|
|
34
|
-
|
9
|
+
getctx = ([".parent"] * depth).join
|
10
|
+
at_index = if binding_index < 10
|
11
|
+
"at_#{binding_index}"
|
12
|
+
else
|
13
|
+
"at_index(#{binding_index})"
|
14
|
+
end
|
35
15
|
|
36
|
-
|
37
|
-
|
38
|
-
|
16
|
+
set_index = if binding_index < 10
|
17
|
+
"at_#{binding_index}= value"
|
18
|
+
else
|
19
|
+
"set_index(#{binding_index}, value)"
|
20
|
+
end
|
39
21
|
|
40
|
-
|
41
|
-
|
42
|
-
|
22
|
+
klass = <<KLASS
|
23
|
+
class #{cname} < Nydp::ContextSymbol
|
24
|
+
def initialize name
|
25
|
+
@name = name
|
26
|
+
end
|
43
27
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
28
|
+
def value ctx
|
29
|
+
ctx#{getctx}.#{at_index} || Nydp::NIL
|
30
|
+
end
|
31
|
+
|
32
|
+
def assign value, ctx
|
33
|
+
ctx#{getctx}.#{set_index}
|
34
|
+
end
|
35
|
+
|
36
|
+
def execute vm
|
37
|
+
vm.push_arg value vm.current_context
|
38
|
+
end
|
39
|
+
|
40
|
+
def inspect ; to_s ; end
|
41
|
+
def to_s ; "[#{depth}##{binding_index}]\#{@name}" ; end
|
42
|
+
end
|
43
|
+
KLASS
|
48
44
|
|
49
|
-
|
50
|
-
|
51
|
-
return fast || ContextLookupN.new(depth)
|
45
|
+
eval klass
|
46
|
+
const_get(cname).new(name)
|
52
47
|
end
|
53
48
|
end
|
54
49
|
end
|
@@ -84,14 +84,84 @@ module Nydp
|
|
84
84
|
handle e, args.car, args.cdr
|
85
85
|
end
|
86
86
|
end
|
87
|
+
|
88
|
+
# TODO generate various Invocation_XXX classes on-demand instead of hand_coding them all up front
|
89
|
+
class Invocation_SYM < Invocation::Base
|
90
|
+
def initialize expr, src
|
91
|
+
super src
|
92
|
+
@sym = expr.car
|
93
|
+
end
|
94
|
+
|
95
|
+
def execute vm
|
96
|
+
@sym.value.invoke_1 vm
|
97
|
+
rescue Exception => e
|
98
|
+
handle e, @sym.value, Nydp::NIL
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
class Invocation_SYM_LEX < Invocation::Base
|
103
|
+
def initialize expr, src
|
104
|
+
super src
|
105
|
+
@sym = expr.car
|
106
|
+
@lex = expr.cdr.car
|
107
|
+
end
|
108
|
+
|
109
|
+
def execute vm
|
110
|
+
fn = @sym.value
|
111
|
+
a0 = @lex.value(vm.current_context)
|
112
|
+
fn.invoke_2 vm, a0
|
113
|
+
rescue Exception => e
|
114
|
+
handle e, fn, cons(a0)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class Invocation_SYM_LEX_LEX < Invocation::Base
|
119
|
+
def initialize expr, src
|
120
|
+
super src
|
121
|
+
@sym = expr.car
|
122
|
+
@lex_0 = expr.cdr.car
|
123
|
+
@lex_1 = expr.cdr.cdr.car
|
124
|
+
end
|
125
|
+
|
126
|
+
def execute vm
|
127
|
+
fn = @sym.value
|
128
|
+
a0 = @lex_0.value(vm.current_context)
|
129
|
+
a1 = @lex_1.value(vm.current_context)
|
130
|
+
fn.invoke_3 vm, a0, a1
|
131
|
+
rescue Exception => e
|
132
|
+
handle e, fn, cons(a0, cons(a1))
|
133
|
+
end
|
134
|
+
end
|
87
135
|
end
|
88
136
|
|
89
137
|
class FunctionInvocation
|
90
138
|
extend Helper
|
91
139
|
attr_accessor :function_instruction, :argument_instructions
|
92
140
|
|
141
|
+
def self.sig klass
|
142
|
+
case klass
|
143
|
+
when Nydp::Symbol ; "SYM"
|
144
|
+
when Nydp::ContextSymbol ; "LEX"
|
145
|
+
when Nydp::Literal ; "LIT"
|
146
|
+
when Nydp::FunctionInvocation ; "NVK"
|
147
|
+
when Nydp::Invocation::Base ; "NVB"
|
148
|
+
when Nydp::InterpretedFunction ; "IFN"
|
149
|
+
when Nydp::Cond ; "CND"
|
150
|
+
when Nydp::Assignment ; "ASN"
|
151
|
+
else ; raise "no sig for #{klass.class.name}"
|
152
|
+
end
|
153
|
+
end
|
93
154
|
def self.build expression, bindings
|
94
155
|
compiled = Compiler.compile_each(expression, bindings)
|
156
|
+
invocation_sig = compiled.map { |x| sig x }.join("_")
|
157
|
+
|
158
|
+
cname = "Invocation_#{invocation_sig}"
|
159
|
+
iclass = Nydp::Invocation.const_get(cname) rescue nil
|
160
|
+
if iclass
|
161
|
+
# puts "found #{cname}"
|
162
|
+
return iclass.new(compiled, expression)
|
163
|
+
end
|
164
|
+
|
95
165
|
invocation = cons case expression.size
|
96
166
|
when 1
|
97
167
|
Invocation::Invocation_1.new(expression)
|
data/lib/nydp/lexical_context.rb
CHANGED
@@ -1,71 +1,51 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
def nth n
|
12
|
-
case n
|
13
|
-
when 0
|
14
|
-
self
|
15
|
-
when -1
|
16
|
-
raise "wrong nesting level"
|
17
|
-
else
|
18
|
-
parent.nth(n - 1)
|
1
|
+
module Nydp
|
2
|
+
class LexicalContext
|
3
|
+
include Nydp::Helper
|
4
|
+
attr_reader :parent
|
5
|
+
attr_accessor :at_0, :at_1, :at_2, :at_3, :at_4, :at_5, :at_6, :at_7, :at_8, :at_9
|
6
|
+
|
7
|
+
def initialize parent
|
8
|
+
@parent = parent
|
19
9
|
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def at_index index
|
23
|
-
values[index] || Nydp::NIL
|
24
|
-
end
|
25
|
-
|
26
|
-
def set name, value
|
27
|
-
names << name
|
28
|
-
values << value
|
29
|
-
end
|
30
10
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
11
|
+
def nth n
|
12
|
+
case n
|
13
|
+
when 0
|
14
|
+
self
|
15
|
+
when -1
|
16
|
+
raise "wrong nesting level"
|
17
|
+
else
|
18
|
+
parent.nth(n - 1)
|
19
|
+
end
|
36
20
|
end
|
37
|
-
end
|
38
21
|
|
39
|
-
|
40
|
-
|
41
|
-
set names.car, arg_0
|
42
|
-
set_args_1 names.cdr, arg_1
|
43
|
-
elsif Nydp::NIL.isnt? names
|
44
|
-
set names, cons(arg_0, cons(arg_1))
|
22
|
+
def at_index index
|
23
|
+
instance_variable_get :"@at_#{index}"
|
45
24
|
end
|
46
|
-
end
|
47
25
|
|
48
|
-
|
49
|
-
|
50
|
-
set names.car, arg_0
|
51
|
-
set_args_2 names.cdr, arg_1, arg_2
|
52
|
-
elsif Nydp::NIL.isnt? names
|
53
|
-
set names, cons(arg_0, cons(arg_1, cons(arg_2)))
|
26
|
+
def set_index index, value
|
27
|
+
instance_variable_set :"@at_#{index}", value
|
54
28
|
end
|
55
|
-
end
|
56
29
|
|
57
|
-
|
58
|
-
|
59
|
-
|
30
|
+
def method_missing mname, *args
|
31
|
+
if mname.to_s =~ /at_\d+=/
|
32
|
+
instance_variable_set :"@#{mname.to_s.sub(/=/, '')}", args[0]
|
33
|
+
elsif mname.to_s =~ /at_\d+/
|
34
|
+
instance_variable_get :"@#{mname}"
|
35
|
+
else
|
36
|
+
super
|
37
|
+
end
|
38
|
+
end
|
60
39
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
40
|
+
def to_s_with_indent str
|
41
|
+
me = @values.map { |k, v|
|
42
|
+
[str, k, "=>", v].join ' '
|
43
|
+
}.join "\n"
|
44
|
+
me + (parent ? parent.to_s_with_indent(" #{str}") : '')
|
45
|
+
end
|
67
46
|
|
68
|
-
|
69
|
-
|
47
|
+
def to_s
|
48
|
+
to_s_with_indent ''
|
49
|
+
end
|
70
50
|
end
|
71
51
|
end
|
@@ -1,203 +1,111 @@
|
|
1
1
|
module Nydp::LexicalContextBuilder
|
2
2
|
extend Nydp::Helper
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
def self.build_set_args_n_method ngiven, nexpected
|
5
|
+
setter_count = [ngiven, nexpected].min
|
6
|
+
arg_names = (0...ngiven ).map { |i| "arg_#{i}"}
|
7
|
+
setters = (0...setter_count).map { |i| "lc.at_#{i}= arg_#{i}"}
|
8
|
+
" def set_args_#{ngiven} lc, #{arg_names.join ", "}
|
9
|
+
#{setters.join "\n "}
|
10
10
|
end
|
11
|
-
|
12
|
-
module B_1
|
13
|
-
def initialize_names names ; @param_name = names.car ; end
|
14
|
-
def set_args_1 lc, arg ; lc.set @param_name, arg ; end
|
15
|
-
def set_args_2 lc, arg_0, arg_1 ; lc.set @param_name, arg_0 ; end
|
16
|
-
def set_args_3 lc, arg_0, arg_1, arg_2 ; lc.set @param_name, arg_0 ; end
|
17
|
-
def set_args lc, args ; lc.set @param_name, args.car ; end
|
11
|
+
"
|
18
12
|
end
|
19
13
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
def set_args_1 lc, arg
|
26
|
-
lc.set @param_name_0, arg
|
27
|
-
end
|
28
|
-
def set_args_2 lc, arg_0, arg_1
|
29
|
-
lc.set @param_name_0, arg_0
|
30
|
-
lc.set @param_name_1, arg_1
|
31
|
-
end
|
32
|
-
def set_args_3 lc, arg_0, arg_1, arg_2
|
33
|
-
lc.set @param_name_0, arg_0
|
34
|
-
lc.set @param_name_1, arg_1
|
35
|
-
end
|
36
|
-
def set_args lc, args
|
37
|
-
lc.set @param_name_0, args.car
|
38
|
-
lc.set @param_name_1, args.cdr.car
|
14
|
+
def self.build_arg_conses arg_names, n
|
15
|
+
if n == arg_names.size - 1
|
16
|
+
"cons(#{arg_names[n]})"
|
17
|
+
else
|
18
|
+
"cons(#{arg_names[n]}, #{build_arg_conses(arg_names, n+1)})"
|
39
19
|
end
|
40
20
|
end
|
41
21
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
lc.set @param_name_0, arg_0
|
53
|
-
lc.set @param_name_1, arg_1
|
54
|
-
end
|
55
|
-
def set_args_3 lc, arg_0, arg_1, arg_2
|
56
|
-
lc.set @param_name_0, arg_0
|
57
|
-
lc.set @param_name_1, arg_1
|
58
|
-
lc.set @param_name_2, arg_2
|
59
|
-
end
|
60
|
-
def set_args lc, args
|
61
|
-
lc.set @param_name_0, args.car
|
62
|
-
lc.set @param_name_1, args.cdr.car
|
63
|
-
lc.set @param_name_2, args.cdr.cdr.car
|
64
|
-
end
|
22
|
+
def self.build_set_args_n_rest_method ngiven, nexpected
|
23
|
+
setter_count = [ngiven, nexpected].min
|
24
|
+
arg_names = (0...ngiven ).map { |i| "arg_#{i}"}
|
25
|
+
setters = (0...setter_count).map { |i| "lc.at_#{i}= arg_#{i}"}
|
26
|
+
if ngiven > setter_count
|
27
|
+
rest_setter = "lc.at_#{nexpected}= #{build_arg_conses arg_names[setter_count..-1], 0}"
|
28
|
+
end
|
29
|
+
" def set_args_#{ngiven} lc, #{arg_names.join ", "}
|
30
|
+
#{setters.join "\n "}
|
31
|
+
#{rest_setter}
|
65
32
|
end
|
66
|
-
|
67
|
-
module B_0_Rest
|
68
|
-
include Nydp::Helper
|
69
|
-
def initialize_names names ; @param_name = names ; end
|
70
|
-
def set_args_1 lc, arg ; lc.set @param_name, cons(arg) ; end
|
71
|
-
def set_args_2 lc, arg_0, arg_1 ; lc.set @param_name, cons(arg_0, cons(arg_1)) ; end
|
72
|
-
def set_args_3 lc, arg_0, arg_1, arg_2 ; lc.set @param_name, cons(arg_0, cons(arg_1, cons(arg_2))) ; end
|
73
|
-
def set_args lc, args ; lc.set @param_name, args ; end
|
33
|
+
"
|
74
34
|
end
|
75
35
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
@param_name_1 = names.cdr
|
81
|
-
end
|
82
|
-
def set_args_1 lc, arg
|
83
|
-
lc.set @param_name_0, arg
|
84
|
-
end
|
85
|
-
def set_args_2 lc, arg_0, arg_1
|
86
|
-
lc.set @param_name_0, arg_0
|
87
|
-
lc.set @param_name_1, cons(arg_1)
|
88
|
-
end
|
89
|
-
def set_args_3 lc, arg_0, arg_1, arg_2
|
90
|
-
lc.set @param_name_0, arg_0
|
91
|
-
lc.set @param_name_1, cons(arg_1, cons(arg_2))
|
92
|
-
end
|
93
|
-
def set_args lc, args
|
94
|
-
lc.set @param_name_0, args.car
|
95
|
-
lc.set @param_name_1, args.cdr
|
96
|
-
end
|
36
|
+
def self.build_set_args_method nexpected
|
37
|
+
setters = (0...nexpected).map { |i| "lc.at_#{i}= args#{ ([".cdr"] * i).join }.car"}
|
38
|
+
" def set_args lc, args
|
39
|
+
#{setters.join "\n "}
|
97
40
|
end
|
98
|
-
|
99
|
-
module B_2_Rest
|
100
|
-
def initialize_names names
|
101
|
-
@param_name_0 = names.car
|
102
|
-
@param_name_1 = names.cdr.car
|
103
|
-
@param_name_2 = names.cdr.cdr
|
104
|
-
end
|
105
|
-
def set_args_1 lc, arg
|
106
|
-
lc.set @param_name_0, arg
|
107
|
-
end
|
108
|
-
def set_args_2 lc, arg_0, arg_1
|
109
|
-
lc.set @param_name_0, arg_0
|
110
|
-
lc.set @param_name_1, arg_1
|
111
|
-
end
|
112
|
-
def set_args_3 lc, arg_0, arg_1, arg_2
|
113
|
-
lc.set @param_name_0, arg_0
|
114
|
-
lc.set @param_name_1, arg_1
|
115
|
-
lc.set @param_name_2, cons(arg_2)
|
116
|
-
end
|
117
|
-
def set_args lc, args
|
118
|
-
lc.set @param_name_0, args.car
|
119
|
-
lc.set @param_name_1, args.cdr.car
|
120
|
-
lc.set @param_name_2, args.cdr.cdr
|
121
|
-
end
|
41
|
+
"
|
122
42
|
end
|
123
43
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
end
|
133
|
-
def set_args_2 lc, arg_0, arg_1
|
134
|
-
lc.set @param_name_0, arg_0
|
135
|
-
lc.set @param_name_1, arg_1
|
136
|
-
end
|
137
|
-
def set_args_3 lc, arg_0, arg_1, arg_2
|
138
|
-
lc.set @param_name_0, arg_0
|
139
|
-
lc.set @param_name_1, arg_1
|
140
|
-
lc.set @param_name_2, arg_2
|
141
|
-
end
|
142
|
-
def set_args lc, args
|
143
|
-
lc.set @param_name_0, args.car
|
144
|
-
lc.set @param_name_1, args.cdr.car
|
145
|
-
lc.set @param_name_2, args.cdr.cdr.car
|
146
|
-
lc.set @param_name_3, args.cdr.cdr.cdr
|
147
|
-
end
|
44
|
+
def self.build_set_args_rest_method nexpected
|
45
|
+
setters = (0...nexpected).map { |i| "lc.at_#{i}= args#{ ([".cdr"] * i).join }.car"}
|
46
|
+
rest_set = "lc.at_#{nexpected}= args#{ ([".cdr"] *(nexpected)).join }"
|
47
|
+
" def set_args lc, args
|
48
|
+
#{setters.join "\n "}
|
49
|
+
#{rest_set}
|
50
|
+
end
|
51
|
+
"
|
148
52
|
end
|
149
53
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
end
|
169
|
-
def _set_args lc, names, args
|
170
|
-
unless Nydp::NIL.is? names
|
171
|
-
lc.set names.car, args.car
|
172
|
-
_set_args lc, names.cdr, args.cdr
|
173
|
-
end
|
174
|
-
end
|
54
|
+
def self.get_builder_class expected_arg_count
|
55
|
+
name = "B_#{expected_arg_count}"
|
56
|
+
existing = const_get(name) rescue nil
|
57
|
+
return name if existing
|
58
|
+
|
59
|
+
n_methods = (1..3).map { |given| build_set_args_n_method given, expected_arg_count }
|
60
|
+
x_method = build_set_args_method expected_arg_count
|
61
|
+
klass = <<KLASS
|
62
|
+
module #{name}
|
63
|
+
def initialize_names names ; end
|
64
|
+
|
65
|
+
#{n_methods.join "\n"}
|
66
|
+
#{x_method}
|
67
|
+
end
|
68
|
+
KLASS
|
69
|
+
|
70
|
+
eval klass
|
71
|
+
name
|
175
72
|
end
|
176
73
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
74
|
+
def self.get_builder_rest_class proper_arg_count
|
75
|
+
name = "B_#{proper_arg_count}_Rest"
|
76
|
+
existing = const_get(name) rescue nil
|
77
|
+
return name if existing
|
78
|
+
|
79
|
+
n_methods = (1..3).map { |given| build_set_args_n_rest_method given, proper_arg_count }
|
80
|
+
x_method = build_set_args_rest_method proper_arg_count
|
81
|
+
klass = <<KLASS
|
82
|
+
module #{name}
|
83
|
+
def initialize_names names ; end
|
84
|
+
|
85
|
+
#{n_methods.join "\n"}
|
86
|
+
#{x_method}
|
87
|
+
end
|
88
|
+
KLASS
|
89
|
+
|
90
|
+
eval klass
|
91
|
+
name
|
192
92
|
end
|
193
93
|
|
194
94
|
def self.select arg_names
|
195
|
-
if pair?
|
196
|
-
size
|
197
|
-
|
95
|
+
if pair?(arg_names)
|
96
|
+
size = arg_names.size
|
97
|
+
proper = arg_names.proper?
|
98
|
+
else
|
99
|
+
size = 0
|
100
|
+
proper = Nydp::NIL.is? arg_names
|
101
|
+
end
|
102
|
+
|
103
|
+
if proper
|
104
|
+
class_name = get_builder_class size
|
198
105
|
else
|
199
|
-
class_name =
|
106
|
+
class_name = get_builder_rest_class size
|
200
107
|
end
|
108
|
+
|
201
109
|
self.const_get(class_name.to_sym)
|
202
110
|
end
|
203
111
|
end
|