如何清空列表

How to empty a list

我试图找出在 Common Lisp 中清空列表(视为堆栈)的方法。

我想到了这个:

(defun emptystack ()
    (dolist (var *stack*) (pop *stack*)))

但它在编译时会产生警告(定义了 VAR 但从未使用过)。

然后我认为这样做会更简单:

(setq *stack* nil)

但是,我仍然想知道是否有任何方法可以像第一个函数那样手动完成,但没有任何未使用的变量。

你可以使用

(defun emptystack ()
  (loop while *stack* do (pop *stack*)))

这确实不使用引擎盖下的变量:

? (macroexpand-1 '(loop while *stack* do (pop *stack*)))
(BLOCK NIL (ANSI-LOOP::LOOP-BODY NIL ((UNLESS *STACK* (GO ANSI-LOOP::END-LOOP))) ((POP *STACK*)) ((UNLESS *STACK* (GO ANSI-LOOP::END-LOOP))) NIL))

可以声明忽略未使用变量:

(defun emptystack ()
  (dolist (var *stack*)
    (declare (ignore var))
    (pop *stack*)))

使用 DO 宏:

(defun emptystack ()
  (do ()                ; no bindings
      ((null *stack*))  ; end test, no further results
    (pop *stack*)))     ; body

LOOP 中,也可以通过将其命名为 nil:

来忽略该变量
(defun emptystack ()
  (loop for nil in *stack* do (pop *stack*)))