2

我正在使用 LISP 开发一个程序,使用 CLISP 运行该程序。

我的函数中有一个 while 语句,但 CLISP 正在返回

*** - EVAL: undefined function WHILE

功能没什么花哨的,

(defun heap-insert (heap item key)
  "Put an item into a heap. [Page 150 CL&R]."
  ;; Note that ITEM is the value to be inserted, and KEY is a function
  ;; that extracts the numeric value from the item.
  (vector-push-extend nil heap)
  (let ((i (- (length heap) 1))
    (val (funcall key item)))
    (while (and (> i 0) (>= (heap-val heap (heap-parent i) key) val))
      do (setf (aref heap i) (aref heap (heap-parent i))
               i (heap-parent i)))
        (setf (aref heap i) item)))
4

3 回答 3

5

Common Lisp 中没有同名的函数或宏(或“语句”)while,因此 CLISP 向您提供该错误消息是正确的。

也许您打算使用loop宏,它接受while作为其语法的一部分。

于 2012-10-18T19:34:41.497 回答
5

你错过了loop之前while

尝试:

(defun heap-insert (heap item key)
  "Put an item into a heap. [Page 150 CL&R]."
  ;; Note that ITEM is the value to be inserted, and KEY is a function
  ;; that extracts the numeric value from the item.
  (vector-push-extend nil heap)
  (let ((i (- (length heap) 1))
    (val (funcall key item)))
    (loop while (and (> i 0) (>= (heap-val heap (heap-parent i) key) val))
      do (setf (aref heap i) (aref heap (heap-parent i))
               i (heap-parent i)))
        (setf (aref heap i) item)))
于 2012-10-18T19:34:56.737 回答
5

Common Lisp中没有标准while的循环结构,Emacs Lisp 中有一个。但是,如果你想要一个,实现它相对简单。

(defmacro while (condition &body body)
  `(loop while ,condition
      do (progn ,@body)))
于 2012-10-19T10:17:25.320 回答