gpt4 book ai didi

lisp:defun 的必需参数不是符号

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:05 26 4
gpt4 key购买 nike

当将遗留代码从 clisp 移植到 sbcl 时,我遇到了引发问题的语法,该代码在 clisp 中运行时没有明显错误:

(defun foo ((alpha integer))
(princ (type-of alpha))
(princ " ")
(prin1 alpha)
(terpri))
(foo 3)
(foo 3.5)
(foo (list "beta" "gamma" "delta"))
;;; output follows ;;;
(INTEGER 0 281474976710655) 3
SINGLE-FLOAT 3.5
CONS ("beta" "gamma" "delta")

显然,第一行中的 integer 纯粹是作为注释修饰。

sbcl,遇到#'foo的相同定义,报错:

Required argument is not a symbol: (ALPHA INTEGER)

这里integer到底有什么用?这两种行为中的哪一种(如果有)符合标准?

编辑:

有问题的遗留代码是某种(古老的)cl-lex,但不是 this one .

最佳答案

您依赖于 CLISP 扩展 CUSTOM:*DEFUN-ACCEPT-SPECIALIZED-LAMBDA-LIST* :

(defun foo ((alpha integer)) ; non-standard
...)

相当于

(defun foo (alpha) ; ANSI CL conformant
(declare (type integer alpha))
...)

custom:*defun-accept-specialized-lambda-list*t 时。

此扩展使 defun看起来有点像defmethod .但是,CLISP ignores type declarations ,所以这种代码修饰的唯一作用是记录程序员的意图。

SBCL 不支持这个扩展,所以你会得到同样的错误你将从 CLISP 中获得自定义:*defun-accept-specialized-lambda-list* 设置为 nil:

*** - FUNCTION: (ALPHA INTEGER) is not a symbol

附言。这个特性是在 13 年前的 2004 年夏天在 CLISP 中引入的。我想知道哪个包使用它。

关于lisp:defun 的必需参数不是符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46472400/

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