class Lisp::PrimEnvironment
Public Class Methods
environment_assign_bang_impl_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 119 def self.environment_assign_bang_impl_impl(args, env) return Lisp::Debug.process_error("environment-assign! requires an environment for it's first argument, received: #{args.car}", env) unless args.car.environment? return Lisp::Debug.process_error("environment-assign! requires a symbol for it's second argument, received: #{args.cadr}", env) unless args.cadr.symbol? local_env = args.car.value binding = local_env.binding_for(args.cadr) binding.value = args.caddr unless binding.nil? end
environment_assignablep_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 110 def self.environment_assignablep_impl(args, env) return Lisp::Debug.process_error("environment-assignable? requires an environment for it's first argument, received: #{args.car}", env) unless args.car.environment? return Lisp::Debug.process_error("environment-assignable? requires a symbol for it's second argument, received: #{args.cadr}", env) unless args.cadr.symbol? local_env = args.car.value binding = local_env.binding_for(args.cadr) Lisp::Boolean.with_value(!binding.nil?) end
environment_assignedp_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 78 def self.environment_assignedp_impl(args, env) return Lisp::Debug.process_error("environment-assigned? requires an environment for it's first argument, received: #{args.car}", env) unless args.car.environment? return Lisp::Debug.process_error("environment-assigned? requires a symbol for it's second argument, received: #{args.cadr}", env) unless args.cadr.symbol? return Lisp::Debug.process_error("environment-assigned?: #{args.cadr.to_s} is unbound", env) unless args.car.value.name_bound_locally?(args.cadr.name) b = args.car.value.local_binding_for(args.cadr) return Lisp::Debug.process_error("environment-assigned?: #{args.cadr.to_s} is bound to a macro", env) if b.value.macro? Lisp::Boolean.with_value(!b.value.nil?) end
environment_bindings_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 54 def self.environment_bindings_impl(args, env) return Lisp::Debug.process_error("environment-bindings requires an environment for it's argument, received: #{args.car}", env) unless args.car.environment? Lisp::ConsCell.array_to_list(args.car.value.bindings.map { |b| Lisp::ConsCell.array_to_list(b.value.nil? ? [b.symbol] : [b.symbol, b.value]) }) end
environment_bound_names_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 40 def self.environment_bound_names_impl(args, env) return Lisp::Debug.process_error("environment-bound-names requires an environment for it's argument, received: #{args.car}", env) unless args.car.environment? e = args.car.value Lisp::ConsCell.array_to_list(e.bound_names) end
environment_boundp_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 71 def self.environment_boundp_impl(args, env) return Lisp::Debug.process_error("environment-bound? requires an environment for it's first argument, received: #{args.car}", env) unless args.car.environment? return Lisp::Debug.process_error("environment-bound? requires a symbol for it's second argument, received: #{args.cadr}", env) unless args.cadr.symbol? Lisp::Boolean.with_value(args.car.value.name_bound_locally?(args.cadr.name)) end
environment_definablep_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 128 def self.environment_definablep_impl(args, env) return Lisp::Debug.process_error("environment-definable?requires an environment for it's first argument, received: #{args.car}", env) unless args.car.environment? return Lisp::Debug.process_error("environment-definable? requires a symbol for it's second argument, received: #{args.cadr}", env) unless args.cadr.symbol? Lisp::TRUE end
environment_define_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 135 def self.environment_define_impl(args, env) return Lisp::Debug.process_error("environment-define requires an environment for it's first argument, received: #{args.car}", env) unless args.car.environment? return Lisp::Debug.process_error("environment-define requires a symbol for it's second argument, received: #{args.cadr}", env) unless args.cadr.symbol? args.car.value.bind_locally(args.cadr, args.caddr) Lisp::TRUE end
environment_lookup_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 88 def self.environment_lookup_impl(args, env) return Lisp::Debug.process_error("environment-lookup requires an environment for it's first argument, received: #{args.car}", env) unless args.car.environment? return Lisp::Debug.process_error("environment-lookup requires a symbol for it's second argument, received: #{args.cadr}", env) unless args.cadr.symbol? return Lisp::Debug.process_error("environment-lookup: #{args.cadr.to_s} is unbound", env) unless args.car.value.name_bound_locally?(args.cadr.name) b = args.car.value.local_binding_for(args.cadr) return Lisp::Debug.process_error("environment-lookup: #{args.cadr.to_s} is unassigned", env) if b.value.nil? return Lisp::Debug.process_error("environment-lookup: #{args.cadr.to_s} is bound to a macro", env) if b.value.macro? b.value end
environment_lookup_macro_impl(args, env)
click to toggle source
# 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
environment_macro_names_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 47 def self.environment_macro_names_impl(args, env) return Lisp::Debug.process_error("environment-macro-names requires an environment for it's argument, received: #{args.car}", env) unless args.car.environment? e = args.car.value Lisp::ConsCell.array_to_list(e.bound_values.select {|v| v.macro?}) end
environment_parent_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 155 def self.environment_parent_impl(args, env) return Lisp::Debug.process_error("environment-parent requires an environment for it's argument, received: #{args.car}", env) unless args.car.environment? e = args.car.value e.parent.nil? ? nil : Lisp::Environment.with_value(e.parent) end
environment_parentp_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 34 def self.environment_parentp_impl(args, env) return Lisp::Debug.process_error("environment-has-parent? requires an environment for it's argument, received: #{args.car}", env) unless args.car.environment? Lisp::Boolean.with_value(!args.car.value.parent.nil?) end
environment_reference_type_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 60 def self.environment_reference_type_impl(args, env) return Lisp::Debug.process_error("environment-reference-type requires an environment for it's first argument, received: #{args.car}", env) unless args.car.environment? return Lisp::Debug.process_error("environment-reference-type requires a symbol for it's second argument, received: #{args.cadr}", env) unless args.cadr.symbol? b = args.car.value.binding_for(args.cadr.value) return Lisp::Symbol.named("unbound") if b.nil? return Lisp::Symbol.named("unassigned") if b.value.nil? return Lisp::Symbol.named("macro") if b.value.binding? Lisp::Symbol.named("normal") end
environmentp_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 29 def self.environmentp_impl(args, env) Lisp::Boolean.with_value(args.car.environment?) end
find_top_level_environment_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 195 def self.find_top_level_environment_impl(args, env) return Lisp::Debug.process_error("find-top-level-environment requires a symbol or sting environment name, received: #{args.cadr}", env) unless args.cadr.symbol? || args.cadr.string e = Lisp::TopLevelEnvironments[args.car.to_s] return e.nil? ? nil : Lisp::Environment.with_value(e) end
make_top_level_environment_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 167 def self.make_top_level_environment_impl(args, env) if args.car.string? name = args.car.value args = args.cdr else name = "anonymous top level" end new_env = Lisp::EnvironmentFrame.extending(Lisp::EnvironmentFrame.global, name) if args.length == 1 return Lisp::Debug.process_error("make-top-level-environment expects binding names to be a list", env) unless args.car.list? args.to_a.map do |a| return Lisp::Debug.process_error("make-top-level-environment expects each binding name to be a symbol", env) unless a.car.symbol? new_env.bind_locally_to(a.car, nil) end elsif args.length == 2 return Lisp::Debug.process_error("make-top-level-environment expects binding names to be a list", env) unless args.car.list? return Lisp::Debug.process_error("make-top-level-environment expects binding values to be a list", env) unless args.cadr.list? return Lisp::Debug.process_error("make-top-level-environment expects binding name and value lists to be the same length", env) if args.car.length != args.cadr.length args.car.zip(args.cadr).map do |name, value| return Lisp::Debug.process_error("make-top-level-environment expects each binding name to be a symbol", env) unless name.symbol? new_env.bind_locally_to(name, value) end end return Lisp::Environment.with_value(new_env) end
procedure_environment_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 149 def self.procedure_environment_impl(args, env) Lisp::Debug.process_error("procedure-environment requires a user written function as it's argument", env) unless args.car.function? Lisp::Environment.with_value(args.car.env) end
register()
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 5 def self.register Primitive.register("environment?", "1") {|args, env| Lisp::PrimEnvironment::environmentp_impl(args, env)} Primitive.register("environment-has-parent?", "1") {|args, env| Lisp::PrimEnvironment::environment_parentp_impl(args, env) } Primitive.register("environment-bound-names", "1") {|args, env| Lisp::PrimEnvironment::environment_bound_names_impl(args, env) } Primitive.register("environment-macro-names", "1") {|args, env| Lisp::PrimEnvironment::environment_macro_names_impl(args, env) } Primitive.register("environment-bindings", "1") {|args, env| Lisp::PrimEnvironment::environment_bindings_impl(args, env) } Primitive.register("environment-reference-type", "2") {|args, env| Lisp::PrimEnvironment::environment_reference_type_impl(args, env) } Primitive.register("environment-bound?", "2") {|args, env| Lisp::PrimEnvironment::environment_boundp_impl(args, env) } Primitive.register("environment-assigned?", "2") {|args, env| Lisp::PrimEnvironment::environment_assignedp_impl(args, env) } Primitive.register("environment-lookup", "2") {|args, env| Lisp::PrimEnvironment::environment_lookup_impl(args, env) } Primitive.register("environment-lookup-macro", "2") {|args, env| Lisp::PrimEnvironment::environment_lookup_macro_impl(args, env) } Primitive.register("environment-assignable?", "2") {|args, env| Lisp::PrimEnvironment::environment_assignablep_impl(args, env) } Primitive.register("environment-assign!", "3") {|args, env| Lisp::PrimEnvironment::environment_assign_bang_impl(args, env) } Primitive.register("environment-definable?", "2") {|args, env| Lisp::PrimEnvironment::environment_definablep_impl(args, env) } Primitive.register("environment-define", "3") {|args, env| Lisp::PrimEnvironment::environment_define_impl(args, env) } Primitive.register("the-environment", "0") {|args, env| Lisp::PrimEnvironment::the_environment_impl(args, env) } Primitive.register("procedure-environment", "1") {|args, env| Lisp::PrimEnvironment::procedure_environment_impl(args, env) } Primitive.register("environment-parent", "1") {|args, env| Lisp::PrimEnvironment::environment_parent_impl(args, env) } Primitive.register("system-global-environment", "0") {|args, env| Lisp::PrimEnvironment::system_global_environment_impl(args, env) } Primitive.register("make-top-level-environment", "1|2|3") {|args, env| Lisp::PrimEnvironment::make_top_level_environment_impl(args, env) } Primitive.register("find-top-level-environment", "1") {|args, env| Lisp::PrimEnvironment::find_top_level_environment_impl(args, env) } end
system_global_environment_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 162 def self.system_global_environment_impl(args, env) Lisp::Environment.with_value(Lisp::EnvironmentFrame.global) end
the_environment_impl(args, env)
click to toggle source
# File lib/rubylisp/prim_environment.rb, line 143 def self.the_environment_impl(args, env) Lisp::Environment.with_value(env) if env == Lisp.EnvironmentFrame.global || env.parent == Lisp.EnvironmentFrame.global Lisp::Debug.process_error("the-environment can only be called from a top-level environment", env) end