2017-02-06 2 views
1

Ich mache diese Funktion.Lisp: IF-Bedingung mit AND-Operator

(f 3 4) (sum = 7) 
(f 'a 'b) (not num!) 

Mein Problem ist, wie kann ich machen, wenn Bedingung mit und Operator. versuchen

I ....

  1. (IF (and (typep a 'integer) (typep b 'integer)) (1) (0))

  2. (IF (and ((typep a 'integer)) ((typep b 'integer))) (1) (0))

  3. (IF ((and ((typep a 'integer)) ((typep b 'integer)))) (1) (0))

Aber es funktioniert nicht. (1) (0) ist ich vorübergehend eingestellt.

Kann ich Lisp Syntax Hilfe bekommen?

+1

Die erste sollte funktionieren, wenn Sie die Klammern um die Zahlen entfernen (ändern Sie '(1) (0)' in '1 0'). Sie könnten auch "ganzzahlp" anstelle von "(typep ... 'integer") verwenden. – jkiiski

+0

Vielen Dank für Ihre Antwort. –

+0

das nächste Mal bitte kopieren und fügen Sie Ihren Code und die Fehlermeldung, die Sie bekommen haben. Wir werden Ihnen beibringen, wie Sie die Fehlermeldungen verstehen. – sds

Antwort

5

Das Wichtigste, was Sie über Lisp in diesem Moment lernen müssen, ist, dass Parens Angelegenheit.

In C können Sie schreiben 1+3, (1)+3, (((1+3))) und sie alle bedeuten die gleiche Sache. In Lisp sind sie sehr sehr unterschiedlich:

  • a bedeutet "den Wert der Variable namens a".
  • (a) bedeutet "der Rückgabewert der Funktion namens a aufgerufen ohne Argumente".
  • ((a)) ist ein Syntaxfehler (siehe aber PPS)

Also, jede Version mit ((...)) völlig falsch ist.

Da es keine Funktion namens 1 gibt, ist die erste Version auch nicht gut.

Was Sie brauchen, ist:

(if (and (typep a 'integer) 
     (typep b 'integer)) 
    1 
    0) 

Hinweis Formatierung und Vertiefung. Lispers gelesen Code durch Einrückung, nicht Parens, so richtig Einrückung ist kritisch. Beachten Sie, dass Emacs (und möglicherweise einige andere Lisp-spezifische IDEs) Lisp-Code für Sie einrücken.

PS. Die Beschreibung dessen, was Sie versuchen, ist unklar, zu erreichen, aber es könnte sein, dass der einfachste Weg, generische Funktionen zu verwenden ist:

(defgeneric f (a b) 
    (:method ((a integer) (b integer)) 
    (+ a b))) 
(f 1 2) 
==> 3 
(f 1 'a)  
*** - NO-APPLICABLE-METHOD: When calling #<STANDARD-GENERIC-FUNCTION F> with 
     arguments (1 A), no method is applicable. 

PPS. Schließlich werden Sie legitime ((...) ...), z.B.cond,:

(defun foo (a) 
    (cond ((= a 1) "one") 
     ((= a 2) "two") 
     (t "many"))) 
(foo 1) 
==> "one" 
(foo 3) 
==> "many" 

oder lambda forms:

((lambda (x) (+ x 4)) 5) 
==> 9 

aber Sie brauchen noch nicht über diejenigen zu kümmern.

+0

Die Notiz war hilfreich für das Lernen. Danke für die Antwort. –

+0

Gern geschehen. Frag weiter! – sds