如何清空列表

Man*_*uel 0 lisp stack common-lisp

我试图找出在Common Lisp中清空列表(看作堆栈)的方法.

我想出了这个:

(defun emptystack ()
    (dolist (var *stack*) (pop *stack*)))
Run Code Online (Sandbox Code Playgroud)

但它在编译时生成警告(VAR已定义但从未使用过).

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

(setq *stack* nil)
Run Code Online (Sandbox Code Playgroud)

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

Rai*_*wig 6

人们可以申报忽略未使用的变量:

(defun emptystack ()
  (dolist (var *stack*)
    (declare (ignore var))
    (pop *stack*)))
Run Code Online (Sandbox Code Playgroud)

随着DO宏:

(defun emptystack ()
  (do ()                ; no bindings
      ((null *stack*))  ; end test, no further results
    (pop *stack*)))     ; body
Run Code Online (Sandbox Code Playgroud)

LOOP一个人也可以通过命名它来忽略变量nil:

(defun emptystack ()
  (loop for nil in *stack* do (pop *stack*)))
Run Code Online (Sandbox Code Playgroud)


use*_*lpa 5

你可以用

(defun emptystack ()
  (loop while *stack* do (pop *stack*)))
Run Code Online (Sandbox Code Playgroud)

确实没有使用引擎盖下的变量:

? (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))
Run Code Online (Sandbox Code Playgroud)