;;AUTOLOAD: closure
;;AUTODOC: closure "create a closure object"
;;(closure func first-arguments)
;;
;;returns an object (closure), that, when applied to arguments will apply 
;;the function func to the concatenation of arguments after first-arguments
;;which can be viewed as the "freezed" arguments of func for this closure
;;example:
;;    (setq +1 (closure + 1))
;;     ;; +1 is thus a closure, specialization of "+" with first arg set to the
;;     ;; value "1"
;;    (+1 2)  --> 3

(defun closure (func &rest closure:internal-args)
  (eval `(lambda (&rest closure:instance-args)
    (apply ,func (+ ',closure:internal-args closure:instance-args))
)))

    
