私は、古くてほとんど知られていない 7 ビット文字セットを Unicode に変換するコードを作成するアドホック パーサー ジェネレーターを作成しました。パーサー ジェネレーターへの呼び出しは、 でdefun
囲まれた一連の に展開され、progn
コンパイルされます。defun
生成されたs の 1 つ (トップレベルのもの) だけをシステムの残りの部分に公開したいと考えています。他のすべてはパーサーの内部にあり、最上位のパーサーの動的スコープ内からのみ呼び出されます。したがって、defun
生成された他の にはインターンされていない名前があります ( で作成gensym
)。この戦略は SBCL では問題なく機能しますが、最近 CLISP で初めてテストしたところ、次のようなエラーが発生しました。
*** - FUNCALL: undefined function #:G16985
CLISP はインターンされていない名前の関数を処理できないようです。(興味深いことに、システムは問題なくコンパイルされました。)編集:ほとんどの場合、インターンされていない名前の関数を処理できるようです。以下のRördによる回答を参照してください。
私の質問は次のとおりです: これは CLISP の問題ですか、それとも特定の実装 (例: SBCL) がたまたま克服した Common Lisp の制限ですか?
編集:
たとえば、トップレベルで生成された関数 ( と呼ばれる) のマクロ展開parse
には、次のような式があります。
(PRINC (#:G75735 #:G75731 #:G75733 #:G75734) #:G75732)
この式を ( を呼び出してparse
) 評価すると、関数がまったく同じマクロ展開内で明確に定義されていても、上記のようなエラーが発生します。
(DEFUN #:G75735 (#:G75742 #:G75743 #:G75744) (DECLARE (OPTIMIZE (DEBUG 2)))
(DECLARE (LEXER #:G75742) (CONS #:G75743 #:G75744))
(MULTIPLE-VALUE-BIND (#:G75745 #:G75746) (POP-TOKEN #:G75742)
...
#:G75735 の 2 つのインスタンスは、間違いなく同じシンボルです。同じ名前の 2 つの異なるシンボルではありません。前述したように、これは SBCL では機能しますが、CLISP では機能しません。
編集:
SO ユーザーの Joshua Taylor は、これは長きにわたる CLISP のバグによるものであると指摘しています。