我是新来的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))))))
它提供了错误符号-PACKAGE-锁定错误,一种风格,警告和警告,请帮助解决它
我是新来的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))))))
它提供了错误符号-PACKAGE-锁定错误,一种风格,警告和警告,请帮助解决它
你试图重新定义cl:subst
。 据§11.1.2.1.2的HyperSpec的,它是不确定的,当你尝试这样做,会发生什么情况。 大多数实现有某种防止这样的重新定义包锁。 你可以避开那些,通过解锁包,但它会在这种情况下更好地或者使用一个名字比其他subst
(例如, my-subst
),或定义一个新包,说my-cl
,即阴影cl:subst
并定义my-cl:subst
代替。
该SBCL给出了错误实际上是相当翔实,并且提供给HyperSpec页面,我联系到上面,还有一个参考第11章包上锁从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))))))
; in: DEFUN SUBST
; (SB-INT:NAMED-LAMBDA SUBST
; (NEW OLD L)
; (BLOCK SUBST (COND ((NULL L) 'NIL) ((EQ OLD #) (CONS NEW #)) ((CONS # #)))))
; ==>
; #'(SB-INT:NAMED-LAMBDA SUBST
; (NEW OLD L)
; (BLOCK SUBST
; (COND ((NULL L) 'NIL) ((EQ OLD #) (CONS NEW #)) ((CONS # #)))))
;
; caught STYLE-WARNING:
; The definition has no &KEY arguments, but the proclamation did.
; (SUBST NEW OLD (CDR L))
;
; caught WARNING:
; recursion in known function definition
; policy=((COMPILATION-SPEED . 1) (DEBUG . 1) (INHIBIT-WARNINGS . 1)
; (SAFETY . 1) (SPACE . 1) (SPEED . 1))
; arg types=(T T T)
;
; compilation unit finished
; caught 1 WARNING condition
; caught 1 STYLE-WARNING condition
STYLE-WARNING: redefining COMMON-LISP:SUBST in DEFUN
debugger invoked on a SYMBOL-PACKAGE-LOCKED-ERROR in thread #<THREAD
"initial thread" RUNNING
{1002978E71}>:
Lock on package COMMON-LISP violated when setting fdefinition of SUBST while
in package COMMON-LISP-USER.
See also:
The SBCL Manual, Node "Package Locks"
The ANSI Standard, Section 11.1.2.1.2