2016-03-25 3 views
3

Я пытаюсь выяснить, как установить параметры по умолчанию или дополнительные параметры в Схеме.Как установить параметры по умолчанию или дополнительные параметры в схеме?

Я попытался (define (func a #!optional b) (+ a b)), но я не могу найти способ проверить, если b является параметром по умолчанию, потому что просто вызвать (func 1 2) даст ошибку:

Error: +: number required, but got #("halt") [func, +] 

Я также попытался (define (func a [b 0]) (+ a b)) но Я получаю следующее сообщение об ошибке:

Error: execute: unbound symbol: "b" [func] 

Если это поможет, я использую BiwaScheme, используемый в repl.it

+0

поиск «необязательный» на http://community.schemewiki.org/?scheme-faq-language. (нашел его просто по googling «Необязательные аргументы схемы»). –

ответ

2

Это прекрасно работает в Ракетка:

(define (func a (b 0)) ; same as [b 0] 
    (+ a b)) 

Например:

(func 4) 
=> 4 
(func 3 2) 
=> 5 

... Но это не стандартный синтаксис, это зависит от того, используется интерпретатор Scheme. Там же синтаксис для обработки с переменным числом аргументов, он может быть использован для обработки необязательных аргументов со значениями по умолчанию, но это не будет выглядеть как миленькое:

(define (func a . b) 
    (+ a (if (null? b) 0 (car b)))) 

Как это работает? b Список аргументов. Если он пуст, используйте ноль, иначе используйте значение первого элемента.

+0

Да, я никогда не замечал, что ответ на этот вопрос почти такой же, как на Схеме, так как он находится в C (у вас есть варианты «нет», «список» или «макрос»). Это говорит о чем-то, но не уверен, что. – Leushenko

+1

@Leushenko Да, в обработке архейтингов Scheme есть прекрасная красота, но и большое неудобство. Гибкость для получения всего списка означает, что вы можете обрабатывать его, как вам нравится, но это также означает, что вы можете обработать его, как вам нравится. : \ –