输入一个值来代替 (FDEFINITION 'COMP

Input a value to be used instead of (FDEFINITION 'COMP

剪辑:

(defun sorted (seq comp)
(or 
    (< (length seq) 2)
    (and (comp  (car seq) (car seq))
        (sorted (cdr seq) comp)
    )
))    

on ubuntu, 运行 clisp :

(sorted '(1 3 4) #'<)

错误:USE-VALUE :R1 输入要使用的值而不是 (FDEFINITION 'COMP)。

如何解决?

您的代码中有不少错误。

首先,在 Common Lisp 中,数据和函数位于不同的命名空间中。因此,您不能使用 (comp x y) 来调用变量 comp 所引用的函数。您必须使用 funcall 函数。

其次,您将 (car seq)(car seq) 进行比较 - 即与自身进行比较。您可能想说 (car (cdr seq)),它指的是列表中的第二个元素。

经过这些更改后,代码可以正常工作:

(defun sorted (seq comp)
  (or (< (length seq) 2)
      (and (funcall comp (car seq) (car (cdr seq)))
           (sorted (cdr seq) comp))))

* (sorted '(1 3 4) #'<)
T
* (sorted '(1 4 3) #'<)
NIL

在函数的每次迭代中评估 (length seq) 效率不高;要获得列表的长度,系统必须遍历整个列表。实际上,您的代码将花费二次方时间执行线性运算。最好用一个简单的结束检查来代替它。

此外,我会使用函数 firstsecond 而不是 (car seq)(car (cdr seq)),以及 rest 而不是 cdr .最好在您的代码中明确说明您的意思。

经过这些更改,最终代码如下所示:

(defun sorted (seq comp)
  (or (endp (rest seq))
      (and (funcall comp (first seq) (second seq))
           (sorted (rest seq) comp))))