我试图取一个列表的最小值和最大值,并将它们作为一个缺陷返回。

;;
;; Find minimum and maximum of a list
;;
(defun min-max (l)
  (let ((n 0) (min 0) (max 0) (size (numAtomsInList l)))
    (loop (when (= n (- size 1)) (return))
      (cond
        ((> (nth n l) (nth (+ n 1) l))) (setq min 5) ;(nth n l))
        ((< (nth n l) (nth (+ n 1) l))) (setq max 7) ;(nth n l))
        (t (setq max n))
      )
      (incf n)
    )
    (cons min max)
  )
)

当在min max变量之前运行没有SETQs的函数时,它编译得很好,但是我得到了结果(0)0)-在LET中设置的原始值有了SETQs,它给了我一个错误:
错误:试图获取未绑定变量“SETQ”的值。
否则,在循环遍历列表时,如何更改min和max的值为什么在语法正确的情况下假设SETQ是一个变量?

最佳答案

我相信您对cond正文中的表单分组不正确。子句应该看起来像

(cond
  ((> (nth n l) (nth (+ n 1) l)))
  (setq min 5)
  ;; etc
  )

既然你想
(cond
  ((> (nth n l) (nth (+ n 1) l))
   (setq min 5))
  ;; etc
  )

如果您来自Clojure背景,您会发现许多常见Lisp表单的分组不同于它们的Clojure类似物。
如果你有类似的东西
(cond
  (setq x y))

cond将尝试将(CONDITION BODY)作为一个值来计算,而不是作为一个函数(回想一下,在常见的Lisp中,符号可以同时具有一个函数和一个值绑定);这与编写cond是一样的,如果我们将一个值绑定到setq我们就不再得到一个未绑定的变量错误。
? (let ((setq t) (x :x) (y :y)) (cond (setq x y)))
:Y

关于binding - 将LET变量绑定(bind)到Lisp中的新值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28534056/

10-13 09:20
查看更多