2017-09-28 9 views
1

SBCLするCLISPからレガシーコードを移植する場合、私はCLISPの明らかな誤りなく実行されます。このコードによって示され、問題を提起した構文に遭遇しました::DEFUNするために必要な引数ではありませんシンボル

(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の同じ定義に遭遇

SBCLは、文句を言う:まさにここintegerの目的である

Required argument is not a symbol: (ALPHA INTEGER) 

何?これらの2つの動作(どちらか一方でも)が標準に準拠していますか?

EDIT:

問題のレガシーコードは、いくつかの(古代)cl-lexの一種ではなくthis oneです。

+0

あなたは 'defmethod'ではなく' defun'だったと確信していますか? – rsm

+0

@rsmはい、それは 'defun'でした。私はそれを実行したときとまったく同じコードを見ています。 –

答えて

7

あなたはCLISP拡張子CUSTOM:*DEFUN-ACCEPT-SPECIALIZED-LAMBDA-LIST*に依存している:custom:*defun-accept-specialized-lambda-list*tとき

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

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

に相当します。

defun は、defmethodのように少し見えます。 しかし、CLISP ignores type declarations, このコードデコレーションが持つ唯一の効果は、プログラマーの意図の文書化です。

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

PS:あなたはnilcustom:*defun-accept-specialized-lambda-list*セットとCLISPからになるだろう、それ から同じエラーが出るよう

SBCLは、この拡張機能をサポートしていません。この機能は、13年前のCLISPで2004年の夏に導入されました。どのパッケージがそれを使用しているのだろうか。

+0

Mindblowing! 2つの質問:(1)CLISPは型宣言を無視してバグか機能とみなしていますか? (2)私はあなたに別のゾークミッドを借りていますか? –

+1

"機能は在籍期間のバグです"。この場合、元の設計上の決定です。さらに、CLISPの動作は完全に標準に準拠しています。詳細が必要な場合は、別の質問をしてください。 ;-) – sds

+0

CLは、すべての最適化ヒントを無視できるという点で非常に混乱しています。したがって、実際にそれらに頼ることはできません。 – Sylwester

関連する問題