2016-10-15 3 views
-4

Hallo Ich mache eine Bedingung, die ich nur eine Methode aufrufen möchte, wenn die Bedingung wahr ist, das Problem ist, ich kann die Syntax nicht finden, wie eine Methode in C-Lisp ich bin neu mit Diese Sprache ist hier der Code.Erstellen einer Methode in Common Lisp

/* I want to create a method here which i can all anytime in my condition but I am having problem with a syntax 

(void method() 
    (print "Invalid") 
) 

*/ 

(print "Enter number") 
(setq number(read()) 
(cond((< 1 number) (print "Okay")) 
    ((> 1 number) /*I want to call a method here (the invalid one)*/) 
) 
+3

Was soll 'void' tun? Siehe 'defmethod' für Methode von' defun' für Funktion (hat keine Überladung) – Sylwester

+0

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 –

+2

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

Antwort

3

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.

+1

Ja, aber es gibt bereits eine implizite "Prognose" nach dem Test in "cond", so dass diese überflüssig ist. Außerdem benötigen Sie möglicherweise eine 'Finish-Ausgabe ', um sicher zu sein, dass die Eingabeaufforderung angezeigt wird, bevor Sie nach einer Eingabe fragen. – coredump

+1

Danke! Es ist gut, auch Dinge zu lernen, wenn Sie versuchen, anderen Leuten beim Lernen zu helfen! Ich korrigierte die Prognose. Ich werde mich nun mit 'finish-output' vertraut machen. – tsikov

+0

Ich bekomme manchmal Kommentare wie diese, es hilft sicherlich. – coredump