2016-07-10 2 views
1

Недавно я начал использовать ChickenScheme, и теперь я хочу объявить функцию с аргументом по умолчанию (если не указано). Я нашел этот пример на сайте Racket, я знаю, что Racket и ChickenScheme разные, но я думал, что эти основные вещи были одинаковыми.По умолчанию аргумент в схеме лямбда-функции?

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

Это ошибка от переводчика ChickenScheme:

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

ответ

5

В обычной схеме, вы можете использовать dotted tail notation, чтобы получить список дополнительных аргументов, а затем проверять этот список, чтобы увидеть, был ли при условии, что дополнительный аргумент:

(define greet 
    (lambda (given . rest) 
    (let ((surname (if (pair? rest) (car rest) "Smith"))) 
     (string-append "Hello, " given " " surname)))) 

Поскольку это не очень удобно, разные системы Схемы предлагают различные альтернативы для этого. В Цыпленок, мы поддерживаем DSSSL annotations, так что вы можете сделать это:

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

Синтаксис optional arguments в Ракетка фактически нестандартное, поэтому не следует ожидать других переводчиков для его реализации. В Схеме, , стандартные функции - это те, которые определены в отчетах Схемы RxRS, причем R7RS является последним. Но не бойтесь - в Chicken Scheme, вы можете использовать optional:

[syntax] (optional ARGS DEFAULT)

Используйте эту форму для процедур, которые имеют один дополнительный аргумент. Если ARGS - это пустой список, то DEFAULT оценивается и возвращается, в противном случае - первый элемент списка ARGS. Это ошибка, если ARGS содержит более одного значения.

Используйте это так:

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

Это не «стандарт» в том смысле, чтобы не быть указаны в RnRS, но на самом деле это совместимо с [SRFI 89] (Http: // SRFI. schemers.org/srfi-89/srfi-89.html), который является достаточно стандартным для моего вкуса и в любом случае более стандартным, чем, скажем, стиль Guile для необязательных аргументов (который частично основан на синтаксисе DSSSL для необязательных аргументов, как упоминалось в ответе Сямаана). –

Смежные вопросы