Um eine Funktion in Common Lisp legen Sie den defun
Operator verwenden:
(defun signal-error (msg)
(error msg))
Jetzt können Sie es nennen wie so:
(signal-error "This message will be signalled as the error message")
Dann können Sie es einfügen in Ihrem Code wie folgt:
(print "Enter number")
(setq number (read)) ;; <- note that you made a syntax error here.
(cond ((< 1 number) (print "Okay"))
((> 1 number) (signal-error "Number is smaller than 1."))))
In Ihrer Frage fragen Sie nach einem method
. Methoden arbeiten mit Klassen. Zum Beispiel vorstellen, Sie haben zwei Klassen human
und dog
:
(defclass human()())
(defclass dog()())
Um eine Methode spezifisch für jede Klasse erstellen Sie defmethod
verwenden:
(defmethod greet ((thing human))
(print "Hi human!"))
(defmethod greet ((thing dog))
(print "Wolf-wolf dog!"))
Lassen Sie uns für jede Klasse zwei Instanzen erstellen:
(defparameter Anna (make-instance 'human))
(defparameter Rex (make-instance 'dog))
Jetzt können wir jedes Lebewesen mit der gleichen Methode begrüßen:
(greet Anna) ;; => "Hi human"
(greet Rex) ;; => "Wolf-wolf dog!"
Der Prozess der gemeinsamen Lisp zu wissen, welche Methode ausgeführt wird, heißt "Dynamic Dispatch". Im Grunde entspricht es den Klassen des gegebenen Arguments den defmethod
Definitionen.
Aber ich habe keine Ahnung, warum Sie Methoden in Ihrem Codebeispiel benötigen.
Hier ist, wie ich den Code schreiben, wenn ich Sie war:
;; Let's wrap the code in a function so we can call it
;; as much as we want
(defun get-number-from-user()
(print "Enter number: ")
;; wrapping the number in a lexical scope is a good
;; programming style. The number variable is not
;; needed outside the function.
(let ((number (read)))
;; Here we check if the number satisfies our condition and
;; call this function again if not.
(cond ((< number 1) (print "Number is less than 1")
(get-number-from-user))
((> number 1) (print "Ok.")))))
Ich würde vorschlagen, dass Sie „das Land des Lisp“ lesen. Es ist ein tolles Buch für Anfänger.
Was soll 'void' tun? Siehe 'defmethod' für Methode von' defun' für Funktion (hat keine Überladung) – Sylwester
Ich würde auch vorschlagen, dass Sie in das Konditionssystem schauen. Hier ist ein Link, um Sie zu beginnen http://gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html#conditions –
Davids Kommentar ist über tatsächliche Lisp Bedingungen, die Ausnahmen in anderen Sprachen sind aber mit mehr Kraft. Ich stelle fest, dass Sie wahrscheinlich bereits eine Programmiersprache kennen, vielleicht eine der C-Familiensprachen. Es ist schwierig, dein erstes Lispeln über Algol-Wissen aufzunehmen, also ist es besser, grün zu spielen und sofort ein Tutorial oder Buch zu buchen. – Sylwester