2016-07-10 14 views
1

Ich habe vor kurzem begonnen, ChickenScheme zu verwenden, und jetzt möchte ich eine Funktion mit Standardargument deklarieren (falls nicht angegeben). Ich fand dieses Beispiel auf der Racket-Seite, ich weiß, Racket und ChickenScheme sind unterschiedlich, aber ich dachte, dass diese grundlegenden Dinge die gleichen waren. DieseStandardargument in Schema Lambda-Funktion?

(define greet 
    (lambda (given [surname "Smith"]) 
    (string-append "Hello, " given " " surname))) 

ist der Fehler aus dem ChickenScheme Interpreter:

Error: during expansion of (lambda ...) - in `lambda' - lambda-list expected: (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname)) 

Call history: 

<syntax>  (define greet (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname))) 
<syntax>  (##core#set! greet (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname))) 
<syntax>  (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname)) <-- 

Antwort

5

Im Klar Schema können Sie dotted tail notation verwenden, um eine Liste der zusätzlichen Argumente zu erhalten, und dann diese Liste überprüfen, um zu sehen, ob das zusätzliche Argument zur Verfügung gestellt wurde:

Da dies nicht sehr praktisch ist, bieten verschiedene Scheme-Systeme verschiedene Alternativen an. In CHICKEN unterstützen wir DSSSL annotations, so können Sie dies tun:

(define greet 
    (lambda (given #!optional (surname "Smith")) 
    (string-append "Hello, " given " " surname))) 
3

Die Syntax für optional arguments in Racket ist in der Tat nicht-Standard, also nicht erwarten, andere Dolmetscher, sie umzusetzen. Im Schema sind die Standard Funktionen diejenigen, die in den RxRS-Scheme-Berichten definiert sind, wobei R7RS die neueste ist. Aber keine Angst - in Chicken Scheme, können Sie optional verwenden:

[syntax] (optional ARGS DEFAULT)

Verwenden Sie dieses Formular für Verfahren, die ein einzelnes optionales Argument. Wenn ARGS die leere Liste ist, wird DEFAULT ausgewertet und zurückgegeben, ansonsten das erste Element der Liste ARGS. Es ist ein Fehler, wenn ARGS mehr als einen Wert enthält.

Benutzen Sie es wie folgt aus:

(define (greet given . surname) 
    (string-append "Hello, " given " " (optional surname "Smith"))) 
+0

Es ist nicht "Standard" im Sinne von nicht in RNR angegeben werden, aber es ist tatsächlich kompatibel mit [SRFI 89] (http: // Srfl. schemers.org/srfi-89/srfi-89.html), das ist Standard genug für meinen Geschmack, und in jedem Fall mehr Standard als, sagen wir, Guile-Stil für optionale Argumente (die teilweise auf DSSSL-Syntax für optionale Argumente basiert, wie in sjamaans Antwort erwähnt). –