Question

I am working on a program in LISP, using CLISP to run the program.

My function has a while statement in it, but CLISP is returning

*** - EVAL: undefined function WHILE

Function is nothing fancy,

(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)))
Was it helpful?

Solution

You missed loop before your while

try:

(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)))

OTHER TIPS

There's no function or macro (or "statement") with the name while in Common Lisp, so CLISP is right to give you that error message.

Maybe you meant to use the loop macro, which accepts while as part of its syntax.

There is no standard while looping construct in Common Lisp, there is one in Emacs Lisp. However, if you want one, it is relatively simple to make that happen.

(defmacro while (condition &body body)
  `(loop while ,condition
      do (progn ,@body)))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top