13
14
15
16
17
18
19
20
21
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
# File 'lib/nydp/context_symbol.rb', line 13
def self.define_klass name, depth, binding_index
getctx = ([".parent"] * depth).join
at_index = if binding_index < 10
"at_#{binding_index}"
else
"at_index(#{binding_index})"
end
set_index = if binding_index < 10
"at_#{binding_index}= value"
else
"set_index(#{binding_index}, value)"
end
line = __LINE__ + 2
code = <<-KLASS
def initialize name, lexical_depth
@name, @lexical_depth = name, lexical_depth
end
def lexical_reach n
@lexical_depth + n
end
def compile_to_ruby indent, srcs, opts=nil
"\#{indent}_arg_\#{@name.to_s._nydp_name_to_rb_name}"
end
def value ctx
ctx#{getctx}.#{at_index} || nil
rescue
raise "failed looking up \#{@name._nydp_inspect} (\#{@name.class.name}) : lookup expression was ctx#{getctx}.#{at_index}"
end
def assign value, ctx
ctx#{getctx}.#{set_index}
rescue StandardError => e
raise "problem in \#{self.class.name}#assign, name is \#{@name}, depth is \#{depth}, index is #{binding_index}"
end
def depth ; #{depth} ; end
def inspect ; to_s ; end
# def to_s ; "[#{depth}##{binding_index}#\#{@lexical_depth}]\#{@name}" ; end
def to_s ; @name ; end
KLASS
const_set name, Class.new(Nydp::ContextSymbol) {
eval code, binding, "#{name.to_s} : #{__FILE__}", line
}
end
|