Module: Klam::CompilationStages::CurryAbstractionApplications

Included in:
Klam::Compiler
Defined in:
lib/klam/compilation_stages/curry_abstraction_applications.rb

Overview

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)

Instance Method Summary collapse

Instance Method Details

#curry_abstraction_applications(sexp) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 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