Function Lisp标签函数在使用前已删除

Function Lisp标签函数在使用前已删除,function,lisp,common-lisp,Function,Lisp,Common Lisp,我试图使用一个使用标签的局部函数来允许我的函数递归。 代码如下: (defun my-replace (e1 e2 L) "Perform a deep replace e1 with e2 in L." (labels ((my-replace-rec (e1 e2 L) "Used for recursion" (cond ((endp L) nil) ((equal (car L) e1)

我试图使用一个使用标签的局部函数来允许我的函数递归。 代码如下:

(defun  my-replace (e1 e2 L)
  "Perform a deep replace e1 with e2 in L."
  (labels ((my-replace-rec (e1 e2 L)
             "Used for recursion"
             (cond ((endp L) nil)
                   ((equal (car L) e1) (cons e2 (cdr L)))
                   ((listp (car L)) (my-replace-rec e1 e2 (car L)))
                   (t (my-replace-rec e1 e2 (cdr L)))))))
    (my-replace-rec e1 e2 L))
当我让slime评估函数并尝试运行它时:

;   Note: Deleting unused function                                                
;   (LABELS MY-REPLACE-REC)                                                     
; ;                                                                             

; Warning: This function is undefined:                                          
;   MY-REPLACE-REC
我试图尽可能多地融入错误消息,但我正在使用Emacs(我对Emacs还是很陌生),并试图从一个小缓冲区中粘贴出来


为什么会这样?它是定义和使用的,但在使用之前它似乎一直被删除(可能是因为它没有被使用)。

您的缩进已关闭。以下是正确缩进的代码:

(defun  my-replace (e1 e2 L)
  "Perform a deep replace e1 with e2 in L."
  (labels ((my-replace-rec (e1 e2 L)
              "Used for recursion"
              (cond ((endp L) nil)
                    ((equal (car L) e1) (cons e2 (cdr L)))
                    ((listp (car L)) (my-replace-rec e1 e2 (car L)))
                    (t (my-replace-rec e1 e2 (cdr L))))))
          ;; empty labels body here.. 
          )
  ;; my-replace-rec is a global function expected to be defun-ed later
  (my-replace-rec e1 e2 L))
(defun  my-replace (e1 e2 L)
  "Perform a deep replace e1 with e2 in L."
  (labels ((my-replace-rec (e1 e2 L)
              "Used for recursion"
              (cond ((endp L) nil)
                    ((equal (car L) e1) (cons e2 (cdr L)))
                    ((listp (car L)) (my-replace-rec e1 e2 (car L)))
                    (t (my-replace-rec e1 e2 (cdr L))))))
    (my-replace-rec e1 e2 L)))
标签
的工作原理与
let
一样。您需要使用
标签
主体中创建的对象,而不是在函数被销毁后使用

使用let:

(let ((a 10))
  ; a exists here
  )
; a doesn't exist anymore
带有
标签

(labels ((name (arg) arg))
  ; the function exists here
  )
;the function doesn't esist anymore
在您的代码中,您创建
my replace rec
,然后在标签主体中,您什么也不做,在
my replace rec
被销毁后,您将其称为。CommonLisp对此没有任何警告,因为它希望您稍后全局定义它。它不会将它与您碰巧未使用的范围进行比较

移动结束括号,以便在
标签中调用
my replace rec
,emacs将正确识别代码:

(defun  my-replace (e1 e2 L)
  "Perform a deep replace e1 with e2 in L."
  (labels ((my-replace-rec (e1 e2 L)
              "Used for recursion"
              (cond ((endp L) nil)
                    ((equal (car L) e1) (cons e2 (cdr L)))
                    ((listp (car L)) (my-replace-rec e1 e2 (car L)))
                    (t (my-replace-rec e1 e2 (cdr L))))))
          ;; empty labels body here.. 
          )
  ;; my-replace-rec is a global function expected to be defun-ed later
  (my-replace-rec e1 e2 L))
(defun  my-replace (e1 e2 L)
  "Perform a deep replace e1 with e2 in L."
  (labels ((my-replace-rec (e1 e2 L)
              "Used for recursion"
              (cond ((endp L) nil)
                    ((equal (car L) e1) (cons e2 (cdr L)))
                    ((listp (car L)) (my-replace-rec e1 e2 (car L)))
                    (t (my-replace-rec e1 e2 (cdr L))))))
    (my-replace-rec e1 e2 L)))
现在,当您查看代码时,它看起来与此相同,因为您已将其标识为标签中使用了
my replace rec
,而编辑器和您的实现知道它不是