module Klam::CompilationStages::CurryAbstractionApplications

Curry Abstraction Applications

This stage converts all applications of abstractions (i.e., any application that does not have a symbol in rator position) to a curried form in which only one argument is applied at a time. For example:

((foo) 1 2 3)

becomes:

((((foo) 1) 2) 3)

Public Instance Methods

curry_abstraction_applications(sexp) click to toggle source
# File lib/klam/compilation_stages/curry_abstraction_applications.rb, line 16
def curry_abstraction_applications(sexp)
  if sexp.instance_of?(Array)
    if !sexp[0].instance_of?(Symbol) && sexp.length > 2
      [curry_abstraction_applications(sexp[0..-2]),
       curry_abstraction_applications(sexp[-1])]
    elsif sexp[0] == :defun
      sexp[0,3] +
        sexp[3..-1].map { |form| curry_abstraction_applications(form) }
    else
      sexp.map { |form| curry_abstraction_applications(form) }
    end
  else
    sexp
  end
end