代码之家  ›  专栏  ›  技术社区  ›  Bill Evans at Mariposa

lisp:定义非符号的必需参数

  •  2
  • Bill Evans at Mariposa  · 技术社区  · 7 年前

    在将遗留代码从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

    #'foo ,投诉:

    Required argument is not a symbol: (ALPHA INTEGER)
    

    具体目的是什么 在这里这两种行为中哪一种符合标准?

    编辑:

    所讨论的遗留代码是某种(古老的)类型 cl-lex ,但不是 this one .

    1 回复  |  直到 7 年前
        1
  •  7
  •   sds    7 年前

    您正在依赖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不支持此扩展,因此您会从中得到相同的错误 自定义:*defun接受专用lambda列表* 设置为 nil :

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

    注:该功能于13年前的2004年夏天在CLISP中引入。我想知道哪个软件包使用它。