在将旧代码从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
但是,CLISPdefmethod
因此,这个代码装饰的唯一作用是记录程序员的意图。
SBCL不支持此扩展,因此您将从中得到相同的错误
你会从CLISP那里得到
custom:*defun-accept-specialized-lambda-list*设置为nil
*** - FUNCTION: (ALPHA INTEGER) is not a symbol

这项功能是13年前2004年夏天在CLISP中引入的我想知道是哪个包裹用的。

07-27 14:00