Können Sie nichts zurück von einer Funktion in Scheme?
Ich Schreibe ein scheme-interpreter, und im Falle einer if-Anweisung wie:
(if (< 1 0) 'true)
Jeder interpreter habe ich versucht, nur gibt eine neue Eingabeaufforderung. Aber wenn ich codiert hatte ich es ein, wenn für den ob gab es eine alternative Ausdruck. Was kann ich in der wenn-so dass nichts gedruckt werden?
(if (has-alternative if-expr)
(eval (alternative if-expr))
#f) ;; what do I return here?
InformationsquelleAutor Kai | 2009-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entsprechend der R6RS-Spezifikation:
Gehen Sie So wild, alles zurückzugeben, was Sie wollen! Obwohl #f ' (), was ich persönlich erwarten würde.
Ich bevorzuge #f da (wenn ' () ...) #t-Zweig (habe zum test mit null?).
InformationsquelleAutor
Regelung kann in der Tat nicht zurück Werte:
In R5RS the one-armed form, wenn angegeben wird, um eine unspezifische Wert.
Das bedeutet, es ist bis zu Ihnen, zu entscheiden, welcher Wert zurück.
Schon ein paar Pläne haben gewählt, um einzuführen, die einen bestimmten Wert genannt
"unbekannter Wert" und gibt diesen Wert.
Andere wieder "unsichtbaren Wert" #<void> und die REPL geschrieben
so, dass es nicht ausdrucken.
Zunächst könnte man denken, das ist das gleiche wie (Werte),
aber beachten Sie den Unterschied:
Wenn #<void> ist Teil einer Liste, es wird gedruckt:
InformationsquelleAutor
Viele Programme (PLT, Ikarus, Huhn) haben einen void-Typ, die Sie produzieren können, mit (void).
In PLT-zumindest, nichtig ist, was Sie bekommen, wenn Sie tun, (wenn (< 1 0) #t).
(PLT v4 nicht zulassen, wenn ohne eine else-Klausel.)
InformationsquelleAutor
Wenn der return-Wert ist unspezifisch, Sie können zurückgeben, was Sie möchten; der Anwender kann einfach nicht darauf verlassen, dass Wert wird dort nie oder Implementierungen.
InformationsquelleAutor
Erstens, es ist OK, sich zu verlangen, wenn eine else-Klausel, wenn es macht es einfacher für Sie. Zweitens, das Schema unterstützt die Rückgabe mehrerer Werte aus einer Funktion, so dass, wenn Sie setzen, die return-Werte als eine Liste, könnte man eine leere Liste bedeutet, dass kein Rückgabewert angegeben wurde.
Einen wichtigen Unterschied hier: ich bin nicht die Rückgabe eine leere Liste, wenn es keine else-Klausel. Die leere Liste bedeutet, dass es keinen Rückgabewert. Wenn es einen Rückgabewert aus einem Ausdruck (sagen, es war 3) müssten Sie (3) die Rückkehr aus der eval hinter die kulissen. Ebenso zurückgeben mehrerer Werte aus einem Ausdruck würde bewirken, dass die eval-return-Liste, um mehrere Elemente.
Schließlich, bei aller Zweckmäßigkeit, könnten Sie wirklich zurück alles wenn die Bedingung nicht, und es gibt kein anderes, denn es wäre ein Fehler in einem Programm, um zu versuchen, um den Wert einer Funktion, die nichts zurückgibt. Als solches wäre es die Aufgabe des Programmierers, nicht der Sprache, zum abfangen dieser Fehler.
InformationsquelleAutor
Seltsame Leute zurückkehren würde
'nil
oder'||
(leeres symbol). Das problem ist die Rückgabe ein symbol, dass nicht die Rückkehr von(eval (alternative if-expr))
um Verwirrung zu vermeiden.Wenn nichts zurückgegeben werden kann, indem
(eval (alternative if-expr))
und Sie wollen immer noch wissen, ob Sie kam in diese alternative oder nicht, Sie haben zu packen, um das Ergebnis mit mehr Informationen :So, das Ergebnis ist eine cons-Zelle. Wenn Ihr Auto ist #t, dann Sie evaled etwas. Wenn es #f ist, Sie nicht.
InformationsquelleAutor
Was ist falsch mit nur:
?
InformationsquelleAutor