Lisp的SYMBOL-PACKAGE-锁定ERROR(Lisp SYMBOL-PACKAGE-LO

2019-09-01 12:34发布

我是新来的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-锁定错误,一种风格,警告和警告,请帮助解决它

Answer 1:

你试图重新定义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


文章来源: Lisp SYMBOL-PACKAGE-LOCKED-ERROR