2016-06-29 1 views

ответ

3

Здесь вы найдете его в документации: Создание расширенных процедур обработки аргументов.

6.10.4.1 лямбда * и определить *.

лямбда *, как лямбда, за исключением того, с некоторыми расширениями, чтобы позволить дополнительные и именованные аргументов.

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

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

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

обув фиксированный аргумент, бар необязательного аргумента с присвоенным значением 42 и БАЗ ключевым словом аргумента со значением по умолчанию 73. По умолчанию значения выражения не не оценивается, если они необходимы, и до процедура вызывается.

Обычно это ошибка, если вызов имеет отличные от тех, указаны # ключевых слов: ключ, но добавление #: Allow-другие-ключи к определению (после ключевого слова объявления аргументов) будут игнорировать неизвестные ключевые слова.

От:

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

1

в стандартной схеме define* не определен, но соглашение об именах диктует, что любой символ, который заканчивается в звездочке обеспечит очень подобную операцию как символ без.

В стандарте есть let, который связывает переменные и let*, который также связывает переменные, но по одному, чтобы созданные переменные были доступны для следующих привязок.

Есть SRFI, которые являются стандартным способом расширения Схемы. Реализации реализуют многие из SRFIs native, а те, кто этого не делает, во многих случаях могут работать только с загрузкой эталонной реализации. SRFI-89 implementsdefine* и lambda*, и они предоставляют Схему с дополнительными позиционными аргументами. Глядя на Guile's SRFI support SRFI-89 отсутствует в списке, но сам SRFI-89 упоминает, что у Guile есть они, за исключением того, что использует нотацию #:key вместо #!key, поэтому не переносится.

Общепринято для реализаций R5RS иметь более глобальные привязки, чем стандарт. Если это не часть SRFI, вы будете заблокированы с помощью таких расширений.