2016-04-30 9 views
-2

У меня есть код для вставки вида списка в LISP. Я понятия не имею, почему это не работает .. не ПОМОЧЬВставка Сортировка списка в общем 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)) 
+1

Что вы подразумеваете под «это Безразлично Не работаешь? Какая у вас ошибка? что случилось с «введите код ее»? почему вы пытаетесь выполнить 'myList' как функцию без аргументов, прежде чем передать это в' insertionSort' – Rptx

ответ

1

Сортировочный сам, кажется, работает, так что проблема с чтением данных от пользователя.

Во-первых, вы не должны использовать 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: ")))