2016-06-29 9 views

Antwort

3

Sie finden es in der Dokumentation hier: Erstellen von erweiterten Verfahren zur Behandlung von Argumenten.

6.10.4.1 Lambda * und definieren *.

lambda * ist wie Lambda, außer mit einigen Erweiterungen optional und Keyword-Argumente zu ermöglichen.

library syntax: lambda* ([var…] 
[#:optional vardef…] 
[#:key vardef… [#:allow-other-keys]] 
[#:rest var | . var]) 
body1 body2 … 

Optional und Keyword-Argumente können auch Standardwerte haben zu nehmen, wenn nicht in einem Aufruf, durch eine aus zwei Elementen bestehende Liste von Variablen Namen und Ausdruck. Zum Beispiel in

(define* (frob foo #:optional (bar 42) #:key (baz 73)) 
    (list foo bar baz)) 

foo ist ein festes Argument, Bar ist ein optionales Argument mit Standard Wert 42, und Baz ist ein Schlüsselwort Argument mit Standardwert 73. Standard Wertausdrücke, es wäre denn nicht bewertet werden Sie werden benötigt und bis wird die Prozedur aufgerufen.

Normalerweise ist es ein Fehler, wenn ein Anruf keywords andere als die hat von # angegeben: Schlüssel, aber das Hinzufügen #: allow-andere-Tasten zur Definition (nach dem Schlüsselwort Argumente Deklarationen) werden unbekannt Schlüsselwörter ignorieren.

Von:

https://www.gnu.org/software/guile/docs/master/guile.html/lambda_002a-and-define_002a.html#lambda_002a-and-define_002a

1

Im Standardschema define* ohne nicht definiert, aber die Namenskonvention verlangt, dass jedes Symbol, das als Symbol liefert sehr ähnliche Operation in einem Sterne endet.

Im Standard haben Sie let, die Variablen bindet und let*, die Variablen auch einzeln bindet, damit die erstellten Variablen für die nächsten Bindungen verfügbar sind.

Es gibt SRFIs, die eine Standardmethode zur Erweiterung von Schema sind. Implementierungen implementieren viele der SRFIs nativ, und diejenigen, die dies nicht tun, können in vielen Fällen nur mit dem Herunterladen der Referenzimplementierung arbeiten. SRFI-89 implementsdefine* und lambda* und sie bieten Schema mit optionalen Positionsargumenten. Betrachtet man Guile's SRFI support SRFI-89 ist nicht aufgeführt, aber die SRFI-89 selbst erwähnt, dass Guile sie hat, außer es verwendet die Notation #:key anstelle von #!key, also nicht tragbar.

Es ist üblich, dass R5RS-Implementierungen mehr globale Bindungen als der Standard aufweisen. Wenn es sich nicht um einen Teil eines SRFI handelt, werden Sie mit solchen Erweiterungen gesperrt.