assert ("foo" + "bar") == "foobar"
assert("foo"[0] == 'f')
-
-
# assert ("foo" + 123) == "foo123"
# assert ("foo" + 123.0) == "foo123.000000"
# assert ("foo" + true) == "footrue"
object = emit(v.name.left)
key = emit(v.name.right)
value = emit(v.value)
- putln "Object_Set(#{object}, #{key}, #{value});"
+ putln "Array_Set(#{object}, #{key}, #{value});"
else
temp = emit(v.value)
error v, "invalid local definition: #{v.name.name}" if not @locals.index(v.name.name)
def linenum(pos = nil)
pos = [pos || @data.pos].flatten.last
- @text[0..pos].count("\n") + 1
+ (@text[0..pos].count("\n") + 1)
end
SPACE = /([ \t\v\n\r]+|#.*\n)/
else
tok = Tok.new("EOF", @file, pos, :eof)
end
-# pp tok
+# pp "#{@file}:#{linenum(pos)}: #{tok.type} - #{tok.text}"
tok
end
end
def infer_set(env, expr)
type = infer(env, expr.name)
+ # TODO: check that LHS is not a string access
+ dest = expr.name
+ if (dest.is_a? IR::Op and dest.op == "[") and dest.left.type == :string
+ error(expr.loc, "cannot assign to immutable value")
+ end
check(env, expr.value, type)
expr.type = :void
end