Ich lerne gerade Guile Scheme, und in der Dokumentation stieß ich plötzlich auf folgende Konstruktion:
%Vor%Das warf mich auf eine Schleife; Bis zu diesem Zeitpunkt hatte ich angenommen, dass formale Parameter immer in einer Liste enthalten waren:
%Vor%Ich frage mich, wann ich diese Variante verwenden soll und wie sich diese von der Punktnotation für eine variable Anzahl von Argumenten unterscheidet. Insbesondere, was ist der Unterschied zwischen den beiden folgenden Varianten:
%Vor%Gibt es einen Unterschied - vielleicht für komplexere Beispiele -, den ich beachten muss, und gibt es einen Grund, einen dem anderen vorzuziehen?
Der Unterschied besteht darin, dass diese Version einen einzigen Parameter namens args
erhält, der nützlich ist, wenn Sie genau wissen, wie viele Argumente für das Formular lambda
erwartet werden:
Und diese Version erhält eine (möglicherweise leere) Liste von Parametern namens args
, die nützlich ist, wenn Sie eine variable Anzahl von Argumenten für das lambda
-Form erwarten:
Es sollte keinen Unterschied zwischen den beiden folgenden Versionen geben, aber nicht alle Interpreter akzeptieren den zweiten, da der Teil vor dem Punkt fehlt (daher sollte es vermieden werden):
%Vor% Die folgende Version ist nützlich, wenn Sie angeben möchten, dass ein lambda
form einen oder mehrere obligatorische Parameter (Symbole links vom Punkt) und eine Liste von null oder mehr optionalen Parametern (ein einzelnes Symbol rechts) enthält des Punktes):
Das warf mich auf eine Schleife; Bis zu diesem Zeitpunkt hatte ich angenommen, dass formale Parameter immer in einer Liste enthalten waren:
Beachten Sie, dass Dinge wie (a . args)
und (a b . args)
ebenfalls keine Listen sind. (a . args)
ist ein Paar, wobei car
das Symbol% co_de% und% a
das Symbol% co_de% ist. cdr
ist ein Paar, wobei args
das Symbol% co_de% und (a b . args)
ist (ein Paar, in dem car
das Symbol% co_de% und% a
das Symbol% co_de% ist). Es sieht eine Weile wie eine Liste aus, mit den cdr
und car
und das, aber da es nicht in null endet / die leere Liste ist es nicht wirklich eine richtige Liste. Strukturen wie diese werden oft als falsche Listen bezeichnet. Wenn Sie möchten, können Sie ein wenig über die Notation mit punktierten Punkten hier lesen, oder woanders ...
Mit b
würde ich vielleicht etwas sagen wie "es ist ein Paar, bei dem cdr
das Symbol% co_de% ist". Oder vielleicht würde es wie "ein Paar, wo die args
ist und die a
ist b
" herauskommen. So oder so würde es nicht viel Sinn machen, und, wie Chris Jester-Young sagte, ist es nicht wirklich gültig Scheme.
Also. Dinge wie (. args)
sind nur eine normale Notation für gepunktetes Paar, um Dinge, die in der letzten cdr
nicht null sind, zu setzen. Wenn die formale Parameter-Sache in Scheme eine dieser unpassenden Listen oder eine richtige Liste oder nur ein Symbol sein kann, dann muss die Definition der formalen Parameter-Sache etwas wie sein: ein formales Parameter-Ding muss null sein, ein Symbol, oder ein Paar, bei dem die args
ein Symbol und die car
eine formale Parameter-Sache ist.
(Was ich denke, ist eine Art coole Sache, die eine ziemlich elegante Art der Bindung von Argumenten an Parameter ermöglicht. Sie sehen zum Beispiel das formale Parameter-Ding, und wenn es ein Symbol ist, binden Sie die Liste von Argumenten daran und wenn es ein Paar ist, bindst du die cdr
der Argumente an die args
der formalen Parameter-Sache und wiederhole an (a b . args)
der formalen Parameter-Sache / Argumente (oh und wenn es null ist, bist du fertig oder etwas). Das erscheint mir ein bisschen hübscher als der Common Lisp-Weg von "und wenn das Symbol in cdr
% car
ist, binden Sie danach die restlichen Argumente an das Symbol".)