module Monkey::Evaluator

Defined in:

monkey/evaluator.cr

Constant Summary

Builtins = {"len" => Object::Builtin.new(Object::BuiltinFunction.new do |args| if args.size != 1 return new_error("wrong number of arguments. got=#{args.size}, want=1") end case arg = args[0] when Object::String Object::Integer.new(arg.value.size.to_i64) when Object::Array Object::Integer.new(arg.elements.size.to_i64) else new_error("argument to 'len' not supported, got #{args[0].type}") end end), "first" => Object::Builtin.new(Object::BuiltinFunction.new do |args| if args.size != 1 return new_error("wrong number of arguments. got=#{args.size}, want=1") end arr = args[0] if arr.is_a?(Object::Array) else return new_error("argument to 'first' must be ARRAY, got #{args[0].type}") end if arr.elements.size == 0 return NULL end return arr.elements[0] end), "last" => Object::Builtin.new(Object::BuiltinFunction.new do |args| if args.size != 1 return new_error("wrong number of arguments. got=#{args.size}, want=1") end arr = args[0] if arr.is_a?(Object::Array) else return new_error("argument to 'last' must be ARRAY, got #{args[0].type}") end if arr.elements.size == 0 return NULL end return arr.elements[-1] end), "rest" => Object::Builtin.new(Object::BuiltinFunction.new do |args| if args.size != 1 return new_error("wrong number of arguments. got=#{args.size}, want=1") end arr = args[0] if arr.is_a?(Object::Array) else return new_error("argument to 'rest' must be ARRAY, got #{args[0].type}") end if arr.elements.size == 0 return NULL end Object::Array.new(arr.elements[1..-1]) end), "push" => Object::Builtin.new(Object::BuiltinFunction.new do |args| if args.size != 2 return new_error("wrong number of arguments. got=#{args.size}, want=2") end arr = args[0] if arr.is_a?(Object::Array) else return new_error("argument to 'push' must be ARRAY, got #{args[0].type}") end Object::Array.new(arr.elements + [args[1]]) end), "puts" => Object::Builtin.new(Object::BuiltinFunction.new do |args| args.each do |arg| puts(arg.inspect) end NULL end)}
FALSE = Object::Boolean.new(false)
NULL = Object::Null.new
TRUE = Object::Boolean.new(true)

Class Method Summary

Class Method Detail

def self.eval(node : AST::Node, env : Object::Environment) : Object::Object #

[View source]