def gettable(id)
raise "no: #{id.inspect}" if Sexp === id
id = id.to_sym if Sexp === id
id = id.to_sym if String === id
return s(:self) if id == :self
return s(:nil) if id == :nil
return s(:true) if id == :true
return s(:false) if id == :false
return s(:str, self.file) if id == "__FILE__""__FILE__"
return s(:lit, lexer.src.current_line) if id == "__LINE__""__LINE__"
result = case id.to_s
when /^@@/ then
s(:cvar, id)
when /^@/ then
s(:ivar, id)
when /^\$/ then
s(:gvar, id)
when /^[A-Z]/ then
s(:const, id)
else
type = env[id]
if type then
s(type, id)
elsif env.dynamic? and :dvar == env[id] then
s(:lvar, id)
else
s(:call, nil, id, s(:arglist))
end
end
return result if result
raise "identifier #{id.inspect} is not valid"
end