class RbScheme::Primitive
Public Class Methods
new()
click to toggle source
# File lib/rb-scheme/primitive.rb, line 9 def initialize @printer = Printer.new end
Public Instance Methods
initialize_vm_primitive!()
click to toggle source
# File lib/rb-scheme/primitive.rb, line 13 def initialize_vm_primitive! put_primitive_proc("+", lambda do |*nums| sum = 0 nums.each do |n| sum += n.value end LInt.new(sum) end) put_primitive_proc("-", lambda do |first, *rest| result = first.value if rest.any? rest.each do |n| result -= n.value end else result = -result end LInt.new(result) end) put_primitive_proc("*", lambda do |*nums| result = 1 nums.each do |n| result *= n.value end LInt.new(result) end) put_primitive_proc("/", lambda do |first, *rest| result = first.value if rest.any? rest.each do |n| result /= n.value end else result = 1 / result end LInt.new(result) end) put_primitive_proc("=", lambda do |n1, n2| boolean(n1.value == n2.value) end) put_primitive_proc("<", lambda do |n1, n2| boolean(n1.value < n2.value) end) put_primitive_proc(">", lambda do |n1, n2| boolean(n1.value > n2.value) end) put_primitive_proc("null?", lambda do |lst| boolean(lst.is_a?(LCell) && lst.null?) end) put_primitive_proc("cons", lambda do |e1, e2| cons(e1, e2) end) put_primitive_proc("car", lambda do |c| unless c.is_a?(LCell) raise ArgumentError, "pair required, but got #{c}" end c.car end) put_primitive_proc("cdr", lambda do |c| unless c.is_a?(LCell) raise ArgumentError, "pair required, but got #{c}" end c.cdr end) put_primitive_proc("list", lambda do |*lst| list(*lst) end) put_primitive_proc("display", lambda do |obj| print_lisp_object(obj) end) put_primitive_proc("newline", lambda do print("\n") end) put_primitive_proc("print", lambda do |obj| puts_lisp_object(obj) end) # todo... end
put_primitive_proc(name, func)
click to toggle source
# File lib/rb-scheme/primitive.rb, line 106 def put_primitive_proc(name, func) prim = Procedure.new(name: name, func: func) Global.put(intern(name), prim) end