Lisp 为什么将“(null x)”替换为“(null(cdr x))”会使代码正常工作?

Lisp 为什么将“(null x)”替换为“(null(cdr x))”会使代码正常工作?,lisp,common-lisp,Lisp,Common Lisp,我是口齿不清的新手。我正在尝试用LISP编写一个冒泡排序函数 这就是我到目前为止所做的 (defun mysort (x) (if (null x) x (if (< (car x) (cadr x)) (cons (car x) (mysort (cdr l))) (cons (cadr x) (mysort (cons (car x) (cddr x))))))) 当我在参考了几个代码之后修改代码时- (defun mysort (x) (if

我是口齿不清的新手。我正在尝试用LISP编写一个冒泡排序函数

这就是我到目前为止所做的

(defun mysort (x)
  (if (null  x) x
    (if (< (car x) (cadr x))
     (cons (car x) (mysort (cdr l)))
     (cons (cadr x) (mysort (cons (car x) (cddr x)))))))
当我在参考了几个代码之后修改代码时-

(defun mysort (x)
  (if (null  (cdr x)) x
   (if (< (car x) (cadr x))
    (cons (car x) (mysort (cdr l)))
    (cons (cadr x) (mysort (cons (car x) (cddr x)))))))
现在它工作得很好

为什么要更换 如果为空x x。。。 具有 如果为空cdr x x。。。 有什么不同


另外,我从另一个函数调用mysort来运行它的长度x次数。是否可以仅使用基本函数在单个递归循环中实现完整排序?

如果要查看第一个元素是否小于第二个元素,则列表至少需要有两个元素

如果只有一个元素,CADR将返回NIL。这不是一个数字

CL-USER 18 > (cadr '(1))
NIL

您的Lisp系统不仅应该告诉您错误,还应该告诉您发生错误的函数。这里:函数如果要查看第一个元素是否小于第二个元素,那么列表至少需要有两个元素

如果只有一个元素,CADR将返回NIL。这不是一个数字

CL-USER 18 > (cadr '(1))
NIL

您的Lisp系统不仅应该告诉您错误,还应该告诉您发生错误的函数。这里:函数要进行比较,您至少需要两个元素,因此检查x是否为NIL是不够的

检查cdrx是否为NIL是检查列表长度是否至少为2的好方法,因为NIL是特殊的,即使它不是cons单元格,也可以保证cdr NIL为NIL


您得到的错误是因为NIL不是一个数字,因此您无法与进行比较。要进行比较,您至少需要两个元素,因此检查x是否为NIL是不够的

检查cdrx是否为NIL是检查列表长度是否至少为2的好方法,因为NIL是特殊的,即使它不是cons单元格,也可以保证cdr NIL为NIL


您得到的错误是因为NIL不是一个数字,因此您无法在工作/失败的情况下与cdr x进行比较?这与使用/返回的x有什么关系?想象一下,当x是‘a/cons’时,是‘nil’对‘nil’,哦,现在明白了。感谢您的帮助。工作/失败案例中的cdr x是什么?这与使用/返回的x有什么关系?想象一下,当x是‘a/cons’时,是‘nil’对‘nil’,哦,现在明白了。谢谢你的帮助。
(defun mysort (x)
  (if x
      (let ((minimum (reduce #'min x)))
        (cons minimum
              (mysort (remove minimum x :count 1))))))