Builtins = {"len"=>Object::Builtin.new(Object::BuiltinFunction.new do|args|if args.size !=1return new_error("wrong number of arguments. got=#{args.size}, want=1")
endcase arg = args[0]
whenObject::StringObject::Integer.new(arg.value.size.to_i64)
whenObject::ArrayObject::Integer.new(arg.elements.size.to_i64)
else
new_error("argument to 'len' not supported, got #{args[0].type}")
endend), "first"=>Object::Builtin.new(Object::BuiltinFunction.new do|args|if args.size !=1return new_error("wrong number of arguments. got=#{args.size}, want=1")
end
arr = args[0]
if arr.is_a?(Object::Array)
elsereturn new_error("argument to 'first' must be ARRAY, got #{args[0].type}")
endif arr.elements.size ==0returnNULLendreturn arr.elements[0]
end), "last"=>Object::Builtin.new(Object::BuiltinFunction.new do|args|if args.size !=1return new_error("wrong number of arguments. got=#{args.size}, want=1")
end
arr = args[0]
if arr.is_a?(Object::Array)
elsereturn new_error("argument to 'last' must be ARRAY, got #{args[0].type}")
endif arr.elements.size ==0returnNULLendreturn arr.elements[-1]
end), "rest"=>Object::Builtin.new(Object::BuiltinFunction.new do|args|if args.size !=1return new_error("wrong number of arguments. got=#{args.size}, want=1")
end
arr = args[0]
if arr.is_a?(Object::Array)
elsereturn new_error("argument to 'rest' must be ARRAY, got #{args[0].type}")
endif arr.elements.size ==0returnNULLendObject::Array.new(arr.elements[1..-1])
end), "push"=>Object::Builtin.new(Object::BuiltinFunction.new do|args|if args.size !=2return new_error("wrong number of arguments. got=#{args.size}, want=2")
end
arr = args[0]
if arr.is_a?(Object::Array)
elsereturn new_error("argument to 'push' must be ARRAY, got #{args[0].type}")
endObject::Array.new(arr.elements + [args[1]])
end), "puts"=>Object::Builtin.new(Object::BuiltinFunction.new do|args|
args.each do|arg|
puts(arg.inspect)
endNULLend)}