2013-04-30 2 views
1

내가 SBCL리스프 SYMBOL-패키지 잠금 오류

(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-패키지 잠금-ERROR, 스타일 (Style) - 경고 및 경고를 제공합니다 문제를 해결할 수 있도록 도와주세요.

답변

4

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