Sha256: b02b0dd24ee1cad3169e2dfbe50e1fa500bd869cdee9417e65c9883dfd59298e

Contents?: true

Size: 1.98 KB

Versions: 2

Compression:

Stored size: 1.98 KB

Contents

(define lambda 
  (native_function "
    Proc.new() do |arguments, interpreter|
      formals = arguments[0]
      body = arguments.slice(1, arguments.length)
      
      if formals.is_a? Array
        # detect if any formal names have been used more than once
        error_message = 'Formal {FORMAL} declared more than once' 
        formals.each_index do |x| 
          tmp = formals.dup
          tmp.delete_at(x)
          raise(error_message.gsub('{FORMAL}', formals[x])) if tmp.include? formals[x] 
        end
      end
      
      sub_env = Flea::Environment.new(interpreter.current_environment)
      
      execute_body = Proc.new() do |body, environment, interpreter|
        interpreter.current_environment = environment
        result = nil
        body.each do |expression|
          result = interpreter.evaluate(expression)
        end
        interpreter.current_environment = environment.parent
        result
      end    
      
      if formals.is_a?(Array) && formals.include?(:'.')
        Proc.new() do |arguments, interpreter|
          args = arguments.dup
          named_formals = formals.slice(0, formals.index(:'.'))
          list_formal = formals[formals.index(:'.') + 1]
          named_formals.each_index do |i|
            sub_env.define(named_formals[i], interpreter.evaluate(args.shift))
          end
          sub_env.define(list_formal, args)
          execute_body.call(body, sub_env, interpreter)
        end
        
      elsif formals.is_a? Array
        Proc.new() do |arguments, interpreter|
          formals.each_index do |i|
            sub_env.define(formals[i], interpreter.evaluate(arguments[i]))
          end
          execute_body.call(body, sub_env, interpreter)
        end
        
      elsif formals.is_a? Symbol
        Proc.new() do |arguments, interpreter|
          arguments = arguments.map {|x| interpreter.evaluate(x) }
          sub_env.define(formals, arguments)
          execute_body.call(body, sub_env, interpreter)
        end
      end
    end
  "))

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
flea-0.1.1 lib/flea/standard_library/lambda.scm
flea-0.1.0 lib/flea/standard_library/lambda.scm