如何清空列表
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*)))
我试图找出在 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*)))