Schema: Warum gibt es die Notwendigkeit, hier eine cond zu benutzen?
-
21-09-2019 - |
Frage
Ich habe versucht, einen zu schreiben (einfach, das heißt ohne eqan?
) one?
Funktion wie so:
(define one?
(lambda (n)
((= 1 n))))
Aber die oben nicht funktioniert zwar, weil, wenn ich es wie so nennen:
(one? 1)
ich mit diesem Fehler begrüßt bekommen:
procedure application: expected procedure, given: #t (no arguments)
Der richtige Weg (von The Little Schemer ), es zu schreiben ist:
(define one?
(lambda (n)
(cond
(else (= 1 n)))))
Warum gibt es eine Notwendigkeit, eine cond
mit einer else
Klausel zu verwenden, anstatt nur Rückkehr (= 1 n)
?
Lösung
Es gibt keinen Grund, warum Sie wollen würde, das zu tun. Ich werde meine Kopie von TLS überprüfen, wenn ich nach Hause komme, um zu sehen, ob ich erahnen kann, was los ist, aber du bist nichts Grundlegendes über cond
oder irgendetwas fehlt.
Antwort auf Ihre Anmerkung oben: Es funktioniert nicht, weil Sie einen zusätzlichen Satz von Klammern im Körper des Lambda haben. Es sollte sein
(lambda (n) (= 1 n))
Die zusätzlichen Klammern in Ihrer Version bedeuten, dass statt den Wert #t
oder #f
zurückzukehren, Sie versuchen, ohne Argumente, diesen Wert als eine Funktion aufzurufen.
Andere Tipps
nicht eine Kopie von The Little Schemer handlich, Ihr Beispiel aussieht, als ob sollte funktionieren. Ich denke, die cond
Fremd ist. In psudeo-C die equivant (mit cond) ist:
int
one(int n)
{
switch (foo) {
default:
return 1 == n;
}
}