我编写了一个临时解析器生成器,它创建代码以将旧的和鲜为人知的 7 位字符集转换为 unicode。对解析器生成器的调用扩展为包含在 a 中的一堆defun
s progn
,然后被编译。我只想将生成defun
的 s 之一——顶层的一个——暴露给系统的其余部分;所有其他都是解析器内部的,并且只能从顶级解析器的动态范围内调用。因此,defun
生成的其他 s 具有非内部名称(使用 创建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 的两个实例绝对是同一个符号——不是同名的两个不同符号。正如我所说,这适用于 SBCL,但不适用于 CLISP。
编辑:
SO 用户 Joshua Taylor 指出这是由于长期存在的 CLISP 错误。