Не могу найти это, выполнив поиск, что такое define*
in guile? Вы можете найти это, например, в этом ответе https://stackoverflow.com/a/24101699/387194Что определяет * в хитрости или схеме?
ответ
Здесь вы найдете его в документации: Создание расширенных процедур обработки аргументов.
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-другие-ключи к определению (после ключевого слова объявления аргументов) будут игнорировать неизвестные ключевые слова.
От:
в стандартной схеме define*
не определен, но соглашение об именах диктует, что любой символ, который заканчивается в звездочке обеспечит очень подобную операцию как символ без.
В стандарте есть let
, который связывает переменные и let*
, который также связывает переменные, но по одному, чтобы созданные переменные были доступны для следующих привязок.
Есть SRFI, которые являются стандартным способом расширения Схемы. Реализации реализуют многие из SRFIs native, а те, кто этого не делает, во многих случаях могут работать только с загрузкой эталонной реализации. SRFI-89 implementsdefine*
и lambda*
, и они предоставляют Схему с дополнительными позиционными аргументами. Глядя на Guile's SRFI support SRFI-89 отсутствует в списке, но сам SRFI-89 упоминает, что у Guile есть они, за исключением того, что использует нотацию #:key
вместо #!key
, поэтому не переносится.
Общепринято для реализаций R5RS иметь более глобальные привязки, чем стандарт. Если это не часть SRFI, вы будете заблокированы с помощью таких расширений.