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.
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
Vielen Dank für Ihre Antwort. –
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