Wann sollte die Lambda-Definition mit einem "nackten" formalen Parameter verwendet werden?

8

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?

    
Janne 11.01.2012, 13:18
quelle

2 Antworten

6

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:

%Vor%

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:

%Vor%

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

%Vor%     
Óscar López 11.01.2012, 14:11
quelle
1
  

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".)

    
Jonas 26.01.2012 20:31
quelle

Tags und Links