我是Lisp的新手所以当我在SBCL中编写函数时
(defun subst (new old l)
(cond
((null l) '())
((eq old (car l)) (cons new (cdr l)))
((cons (car l) (subst new old (cdr l))))))
它给出了错误SYMBOL-PACKAGE-LOCKED-ERROR,样式警告和警告,请帮助解决它
答案 0 :(得分:4)
您正在尝试重新定义cl:subst
。根据HyperSpec的§11.1.2.1.2,未定义当您尝试执行此操作时会发生什么。大多数实现都有某种类型的包锁,这会阻止这种重新定义。您可以通过解锁软件包来解决这些问题,但在这种情况下,使用subst
以外的名称(例如my-subst
)或定义新软件包会更好,比如说{ {1}},隐藏my-cl
并定义cl:subst
。
SBCL提供的错误实际上相当丰富,并提供了我上面链接的HyperSpec页面的引用,以及Chapter 11. Package Locks中的SBCL manual:
my-cl:subst