cl:subst
을 재정의하려고합니다. HyperSpec의 §11.1.2.1.2에 따르면, 그렇게하려고 할 때 어떤 일이 발생하는지는 정의되어 있지 않습니다. 대부분의 구현에는 그러한 재정의를 막는 일종의 패키지 잠금이 있습니다. 패키지를 잠금 해제하여 그 주위를 둘러 볼 수는 있지만이 경우 subst
(예 : my-subst
) 이외의 이름을 사용하거나 그림자가 cl:subst
인 새 패키지, 예를 들어 my-cl
을 정의하고 대신 my-cl:subst
을 정의하는 것이 좋습니다. .
SBCL 실제로는 오히려 유익주고, 나는 위의 링크 된 HyperSpec과 페이지에 대한 참조뿐만 아니라 SBCL manual에서 Chapter 11. Package Locks 제공 오류 :
* (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
을