gpt4 book ai didi

macros - 在 Common Lisp 中重命名 lambda

转载 作者:行者123 更新时间:2023-12-04 01:40:19 25 4
gpt4 key购买 nike

我最近开始学习 Common Lisp,并且(只是为了好玩)决定重命名 lambda 宏。

我的尝试是这样的:

> (defmacro λ (args &body body) `(lambda ,args ,@body))

它本身似乎可以正确扩展:
> (macroexpand-1 '(λ (x) (* x x)))
(LAMBDA (X) (* X X))

但是当它嵌套在表达式中时,执行失败:
> ((λ (x) (* x x)) 2)
(Λ (X) (* X X)) is not a function name; try using a symbol instead

我可能遗漏了一些关于宏扩展的明显内容,但找不到它是什么。

也许你能帮我一下?

编辑:
它确实适用于 lambda:
> ((lambda (x) (* x x)) 2)
4

编辑2:
使其工作的一种方法(如 Rainer 建议的那样):
> (set-macro-character #\λ (lambda (stream char) (quote lambda)))

(在 Clozure CL 中测试)

最佳答案

在 Common Lisp LAMBDA是两个不同的东西:一个宏和一个可以在 LAMBDA 表达式中使用的符号。

LAMBDA 表达式:

(function (lambda (x) (foo x)))

更短的写成
#'(lambda (x) (foo x))

应用的 lambda 表达式也是有效的:
((lambda (x) (+ x x)) 4)

以上两种形式都是 Common Lisp 核心语法的一部分。

在 Common Lisp 定义的后期有一个名为 LAMBDA 的宏已添加。足够令人困惑,但有良好的意图。 ;-) 它记录为 Macro LAMBDA .
(lambda (x) (+ x x))

扩展为
(function (lambda (x) (+ x x))

它使 Common Lisp 代码看起来更像 Scheme 代码,然后就没有必要写了
(mapcar #'(lambda (x) (+ x x)) some-list)

LAMBDA我们可以写的宏
(mapcar (lambda (x) (+ x x)) some-list)

你的例子失败了,因为
((my-lambda (x) (* x x)) 2)

不是有效的 Common Lisp 语法。

Common Lisp 期望
  • 一个数据对象
  • 一个变量
  • 形式为 (function args...) 的函数调用
  • 形式为 ((lambda (arglist ...) body) args...) 的函数调用
  • 宏形式,如 (macro-name forms...)
  • 使用内置特殊运算符之一的特殊形式,如 FUNCTION , LET , ...
    special operators 的列表中定义在 Common Lisp

  • 正如你所看到的语法
    ((macro-name forms...) forms...)

    不是 Common Lisp 的一部分。

    可以读取字符 λLAMBDA :
    (defun λ-reader (stream char)
    (declare (ignore char stream))
    'LAMBDA)

    (set-macro-character #\λ #'λ-reader)

    示例:
    CL-USER 1 > ((λ (x) (* x x)) 3)
    9

    CL-USER 2 > '(λ (x) (* x x))
    (LAMBDA (X) (* X X))

    关于macros - 在 Common Lisp 中重命名 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9557469/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com