macros - 我的宏在 Common Lisp 中的部分应用有问题

标签 macros common-lisp currying

我正在尝试制作一个宏来实现 Common Lisp 中的部分应用。以下是我对如何用伪代码实现它的想法:

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))))

这是我的代码:

(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))

不幸的是,SBCL 给我这个错误:

; 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.

为什么它会提示 car 从未被使用过?我觉得这真的很令人困惑。熟悉 CL 宏的人知道我做错了什么吗?

最佳答案

试试这个:

(defmacro partial-lambda (params &rest body)
    (if (null params) `(progn ,@body)
        `(lambda (,(car params)) (partial-lambda ,(cdr params) ,@body))))

CL-USER 43 > (partial-lambda (x y z) (+ x y z))
#<anonymous interpreted function 40300008DC>

CL-USER 44 > (funcall * 10)
#<anonymous interpreted function 403000094C>

CL-USER 45 > (funcall * 15)
#<anonymous interpreted function 40300009BC>

CL-USER 46 > (funcall * 3)
28

BackquoteQUOTE 的变体,它允许在其中取消引用。 , 当你想取消引用部分内的内容时使用(该表达式被值替换)。并且 ,@(取消引用拼接)取消引用某些内容,替换它并删除该值周围的括号。这些操作常用于 Lisp 宏。

编辑: (car body) 替换为 `(progn ,@body) 用于处理 body 中包含更多表达式的输入:(partial-lambda (x y z) (print 5)(+ x y z))

关于macros - 我的宏在 Common Lisp 中的部分应用有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66371658/

相关文章:

kotlin - Kotlin 有宏吗?

c - 在 C 中,这个宏定义了什么?

c - 没有 undef 的宏名称转义

enums - Common Lisp 中的可比较(可排名/可排序)枚举

macros - 我可以用我自己的自定义宏覆盖标准库中的宏吗?

lisp - Geany 作为 CommonLisp IDE

function - 关于在函数和宏定义中使用结构文字

python - 如何部分应用函数的任意参数?

function - 带有隐式的 Scala 函数式文字

scala - 在 Scala 中使用 foldLeft 将参数列表应用于 curried 函数