I am trying to make a macro to achieve partial application in Common Lisp. Here was my thought on how I would implement that in pseudocode:
If my argument list is null, return the function body
Otherwise, cons together "lambda" with the first argument with a recursive call to "partial-lambda" again
(lambda (x y z) (+ x y z) => (lambda (x) (lambda (y) (lambda (z) (+ x y z))))
Here's my code:
(defmacro partial-lambda (params &rest body)
(if (null params) body
(lambda ((car params)) (partial-lambda (cdr params) body))))
(partial-lambda (x y z) (+ x y z))
Unfortunately, SBCL gives me this error:
; in: DEFMACRO PARTIAL-LAMBDA
; (LAMBDA (CAR PARAMS) (PARTIAL-LAMBDA (CDR PARAMS) BODY))
; ==>
; #'(LAMBDA (CAR PARAMS) (PARTIAL-LAMBDA (CDR PARAMS) BODY))
;
; caught STYLE-WARNING:
; The variable CAR is defined but never used.
; file: /Users/caspianahlberg/Desktop/Programming/Lisp/partial_application.lisp
; in: DEFMACRO PARTIAL-LAMBDA
; (PARTIAL-LAMBDA (CDR PARAMS) BODY)
;
; caught STYLE-WARNING:
; undefined function: COMMON-LISP-USER::PARTIAL-LAMBDA
;
; compilation unit finished
; Undefined function:
; PARTIAL-LAMBDA
; caught 2 STYLE-WARNING conditions
STYLE-WARNING:
PARTIAL-LAMBDA is being redefined as a macro when it was previously assumed to be a function.
Why does it complain about car never being used? I find that really confusing. Does anyone who is good with CL macros know what I am doing wrong?