Подтвердить что ты не робот

Как вы можете переписать "начало" в Схеме?

Как объясняет статья Wikipedia, begin в Схеме - это форма библиотеки, которая может быть переписана с использованием более фундаментальных форм, таких как lambda.

Но как вы переписываете begin, особенно учитывая следующее?

x
===> error: undefined identifier: x
(begin (define x 28) x)
===> 28
x
===> 28
4b9b3361

Ответ 1

Вы не можете. Дело в том, что begin имеет две роли: одна представляет собой последовательность побочных эффектов, а другая заключается в том, что она используется для "сращивания" макросов. Тот факт, что вы можете использовать begin с определением, как в приведенном выше, является результатом этой второй функции, и вы не можете написать ее самостоятельно.

Если вы действительно хотите следовать всей истории, тогда вы можете определить begin как простой макрос, который заставляет его выполнять только секвенциальный аспект (и он действительно может быть реализован как таковой, хотя обычно это не так). Но вам нужно добавить явное распознавание begin для определения сплайсинга (toplevel или internal). Это означает, что реализация макросов прекрасна, но на самом деле это не может быть библиотекой, потому что основной расширитель должен знать об этом. (И поскольку язык лексически охвачен, нет лучшего способа, чтобы основной расширитель идентифицировал begin, которые не определены на основном языке.)

Чтобы суммировать все это, можно сказать, что R5RS ошибочно относится к классификации begin как "синтаксиса библиотеки", поскольку он не может быть определен в библиотеке... но даже это не совсем точно, поскольку R5RS определяет "синтаксис библиотеки" как "производные выражения". Таким образом, реальная неправильная точка состоит в том, что одна из begin двух сторон реализована в другом месте, в расширителе (для контекстов определения).

Обратите внимание также, что R6RS разъясняет всю сделку: две грани begin сделаны явными, и теперь она является частью основного языка, а не "формой библиотеки" и даже не производной формой.

Ответ 2

Вы по-прежнему можете попробовать написать версию начала, которая удовлетворяет своей первой роли: последовательность.

(define-syntax sequencing
  (syntax-rules ()
    [(_ expression) expression]
    [(_ expression expressions ...)
     ((lambda (ignored) (sequencing expressions ...)) expression)]))

Вот сообщение, из которого я взял этот фрагмент. Это обеспечивает лучший контекст, если вы заинтересованы, и вы можете быть.