【问题标题】:Defining functions Scheme-style in Common Lisp, without defun在 Common Lisp 中定义函数 Scheme 风格,没有 defun
【发布时间】:2017-06-01 22:35:11
【问题描述】:

在 Scheme 中,您可以定义类似的函数

(define f (lambda (x) ...))

特别是,你可以做这样的事情

(define f (g))

其中 g 是一些返回函数的函数。是否可以在 Common Lisp 中做同样的事情,即将函数符号与给定的匿名函数相关联?

【问题讨论】:

    标签: scheme common-lisp ansi-common-lisp


    【解决方案1】:

    没关系,我刚刚在 Paul Graham 的书 ANSI Common Lisp 中找到了答案(第二次查看后;第 99 页):

    (setf (symbol-function 'f) (lambda (x) (* x x)))
    

    实现(对于大多数意图和目的)与

    相同
    (defun f (x) (* x x))
    

    【讨论】:

    • defun 做的远不止这些。 (macroexpand '(defun f (x) (* x x)))
    • 这就是为什么我用“出于大多数意图和目的”来限定声明的原因。格雷厄姆的书中也提到了这一点。
    • “对于大多数意图和目的”是相当主观的。如果您正在编译文件,defun 会通知编译器该函数以避免在同一文件中出现引用警告,即使该函数是在引用之后声明的。大多数实现都会注释他们在哪里找到了定义,例如defuns,以便 IDE 或 Emacs+Slime 可以跳转到它们。使用setf 或symbol-function,您不会得到任何这些。
    猜你喜欢
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2011-12-24
    • 2014-08-06
    相关资源
    最近更新 更多