Method: Lisp::PrimEnvironment.environment_lookup_macro_impl

Defined in:
lib/rubylisp/prim_environment.rb

.environment_lookup_macro_impl(args, env) ⇒ Object



99
100
101
102
103
104
105
106
107
# File 'lib/rubylisp/prim_environment.rb', line 99

def self.environment_lookup_macro_impl(args, env)
  return Lisp::Debug.process_error("environment-lookup-macro requires an environment for it's first argument, received: #{args.car}", env) unless args.car.environment?
  return Lisp::Debug.process_error("environment-lookup-macro requires a symbol for it's second argument, received: #{args.cadr}", env) unless args.cadr.symbol?
  return Lisp::Debug.process_error("environment-lookup-macro: #{args.cadr.to_s} is unbound", env) unless args.car.value.name_bound_locally?(args.cadr)
  b = args.car.value.local_binding_for(args.cadr)
  return Lisp::Debug.process_error("environment-lookup-macro: #{args.cadr.to_s} is unassigned", env) if b.value.nil?
  return Lisp::Debug.process_error("environment-lookup-macro: #{args.cadr.to_s} is bound to a macro", env) if b.value.macro?
  b.value
end