Сортировочный сам, кажется, работает, так что проблема с чтением данных от пользователя.
Во-первых, вы не должны использовать SETQ
для ввода переменных. Правильными параметрами будут либо LET
, DEFVAR
or DEFPARAMETER
. Вы должны прочитать главу на странице variables в книге Practical Common Lisp. Однако в этой программе вам не обязательно использовать ни один из них.
Вторая проблема заключается в том, что при вызове INSERTIONSORT
вы заключили в круглые скобки аргумент MYLIST
. В Lisps в скобках обычно рассматриваются как вызовы функций. Поскольку MYLIST
- это переменная, а не функция, которая вызовет ошибку. Правильный способ назвать это, конечно, будет:
(insertionSort myList)
Заметим, кстати, что соглашение об именах в Лиспах является использование нижнего регистра с тире между словами вместо верблюжьего. Поэтому было бы лучше назвать функцию 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' как функцию без аргументов, прежде чем передать это в' insertionSort' – Rptx