公共LISP中列表的插入排序

公共LISP中列表的插入排序,lisp,common-lisp,insertion-sort,Lisp,Common Lisp,Insertion Sort,我有一个关于LISP中列表插入排序的代码。我不知道这为什么不起作用。。帮助 (defun insertionSort (myList) (if (null myList) '() (insertInPlace (car myList) (insertionSort (cdr myList))))) enter code her (defun insertInPlace (e myList) (if (null myList) (co

我有一个关于LISP中列表插入排序的代码。我不知道这为什么不起作用。。帮助

(defun insertionSort (myList)
    (if (null myList)
        '()
        (insertInPlace (car myList) (insertionSort (cdr myList)))))
enter code her
(defun insertInPlace (e myList)
    (if (null myList)
        (cons e '())
        (if (<= e (car myList))
             (cons e myList)
             (cons (car myList) (insertInPlace e (cdr myList))))))

(setq n (read))
(setq n (- n 1))
(setq d (read))
(setq myList (list d))
(dotimes (i n)
     (setq d (read))
     (setq myList (cons d myList))
)
(write myList)
(insertionSort(myList))
(defun insertionSort(myList)
(如果(空myList)
'()
(insertInPlace(car myList)(insertionSort(cdr myList‘‘)’))
给她输入密码
(定义插入空间(e myList)
(如果(空myList)
(e’())

(如果(排序本身似乎有效,那么问题在于读取用户的输入

首先,您不应该使用
SETQ
引入变量。正确的选项是,。您应该阅读本书中的章节。但是,在本程序中,您不一定需要使用任何一个

第二个问题是,当您调用
INSERTIONSORT
时,您将参数
MYLIST
包装在括号中。在Lisps中,括号内的内容通常被视为函数调用。由于
MYLIST
是一个变量而不是函数,这将导致错误。正确的调用方法当然是:

(insertionSort myList)
请注意,顺便说一句,Lisps中的命名约定是在单词之间使用带破折号的小写字母,而不是camelCase。因此,最好将函数命名为
insertion sort
和变量
my list

READ
不是一种非常安全的读取输入的方法。最好将
PARSE-INTEGER
READ-LINE
一起使用来读取用户的数字。为了获得更好的用户体验,您还应该在读取输入之前打印某种提示。下面是一个小的帮助函数:

(defun prompt-for-number (prompt)
  "Display PROMPT and read a number from the user."
  (do ((number nil (parse-integer (read-line *query-io*) :junk-allowed t)))
      (number number)
    (write-string prompt *query-io*)
    (finish-output *query-io*)))
使用它,我们可以要求用户对数字进行如下排序(并对其进行排序):

(insertionSort (loop 
                  repeat (prompt-for-number "How many numbers: ")
                  collecting (prompt-for-number "Number: ")))
“它不工作”是什么意思?会出现什么错误?输入代码她是怎么回事?在将其传递到插入排序之前,为什么要尝试将
myList
作为一个没有参数的函数执行