Erlauben Sie mir, den Code zu identifizieren. Ich kann es nur in DrRacket geklebt und drücken Sie Strg + Ich habe dann die Argumente +
auf einer Linie jeder:
(define (foo x)
(cond ((zero? x) 0)
(else (+ (expt (x (- x 1)))
foo
(- x 1)))))
So das Basismodell ist in Ordnung, aber Ihr Standard-Fall sieht sehr aus. x
wird als Prozedur behandelt, da es Klammern enthält und -
auch x
verwendet, als wäre es eine Zahl. Es kann nicht beides sein.
foo
ist, da sie Klammern nicht nicht angewendet haben um ihn herum, so dass es zu einem Verfahren Wert auswertet, während +
alle seine Argumente numerisch sein erwarten.
Die Regeln des Scheme sind, dass Klammern Angelegenheiten. x
und (x)
sind zwei völlig verschiedene Dinge. Die erste x
kann einen beliebigen Wert haben, aber (x)
ist eine Anwendung, also x
müssen zu einer Prozedur auswerten. Einige Ausnahmen sind für spezielle Formulare, die Sie auswendig kennen müssen, wie cond
und , aber es ist sehr wichtig zu wissen, dass Sie die Bedeutung eines Programms ändern, indem Sie Klammern hinzufügen.
könnte die korrekte Definition der Prozedur sein:
(define (foo x)
(if (zero? x)
0
(+ (expt x (- x 1))
(foo (- x 1)))))
(foo 5) ; ==> 701
Hier habe ich cond
-if
geändert, da wurden verwendet, um keine von cond
s Funktionen. Ich sehe cond
Ich erwarte entweder Nebenwirkungen oder mehr als ein Prädikat.