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)?

War es hilfreich?

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;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top