Die Sortierung selbst scheint zu funktionieren, so ist das Problem mit Eingabe vom Benutzer zu lesen.
Zuerst sollten Sie SETQ
nicht verwenden, um Variablen einzuführen. Die richtigen Optionen wären entweder LET
, DEFVAR
or DEFPARAMETER
. Sie sollten das Kapitel variables im Buch Practical Common Lisp lesen. In diesem Programm müssen Sie jedoch keines von ihnen verwenden. Das zweite Problem besteht darin, dass Sie beim Aufruf INSERTIONSORT
das Argument MYLIST
in Klammern umschlossen haben. In Lisps werden Dinge in Klammern normalerweise als Funktionsaufrufe behandelt. Da MYLIST
eine Variable und keine Funktion ist, führt dies zu einem Fehler. Der richtige Weg, es zu nennen wäre natürlich:
(insertionSort myList)
Hinweis, btw, dass die Namenskonvention in Lisps ist anstelle von Camelcase mit Bindestrichen zwischen den Wörtern Kleinbuchstaben zu verwenden. Daher wäre es besser, die Funktion insertion-sort
und die Variable my-list
zu benennen.
READ
ist keine sehr sichere Art, Eingaben zu lesen. Es ist besser, PARSE-INTEGER
zusammen mit READ-LINE
zu verwenden, um Zahlen vom Benutzer zu lesen. Für eine bessere Benutzererfahrung sollten Sie auch eine Art Aufforderung ausgeben, bevor Sie die Eingabe lesen. Hier ist eine kleine Hilfsfunktion, das zu tun:
(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*)))
dass verwenden, können wir den Benutzer fragen Sie nach Zahlen zu sortieren (und sortieren sie) wie folgt aus:
(insertionSort (loop
repeat (prompt-for-number "How many numbers: ")
collecting (prompt-for-number "Number: ")))
Was meinst du mit „es doesn arbeitest du nicht? Welchen Fehler bekommst du? Was ist los mit "Code eingeben"? Warum versuchen Sie, "myList" als eine Funktion ohne Argumente auszuführen, bevor Sie das an "insertionSort" übergeben – Rptx