输入一个值来代替 (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)
效率不高;要获得列表的长度,系统必须遍历整个列表。实际上,您的代码将花费二次方时间执行线性运算。最好用一个简单的结束检查来代替它。
此外,我会使用函数 first
和 second
而不是 (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))))
剪辑:
(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)
效率不高;要获得列表的长度,系统必须遍历整个列表。实际上,您的代码将花费二次方时间执行线性运算。最好用一个简单的结束检查来代替它。
此外,我会使用函数 first
和 second
而不是 (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))))