在将旧代码从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扩展名:
(defun foo ((alpha integer)) ; non-standard
...)
相当于
(defun foo (alpha) ; ANSI CL conformant
(declare (type integer alpha))
...)
当
CUSTOM:*DEFUN-ACCEPT-SPECIALIZED-LAMBDA-LIST*
是custom:*defun-accept-specialized-lambda-list*
时。此扩展使
t
看起来有点像
defun
。但是,CLISP
defmethod
,因此,这个代码装饰的唯一作用是记录程序员的意图。
SBCL不支持此扩展,因此您将从中得到相同的错误
你会从CLISP那里得到
custom:*defun-accept-specialized-lambda-list*
设置为nil
:*** - FUNCTION: (ALPHA INTEGER) is not a symbol
这项功能是13年前2004年夏天在CLISP中引入的我想知道是哪个包裹用的。