Что, если таковые имеются, не так с этим определением letrec в Схеме?
R5RS дает предложенные определения макросов для библиотечных форм синтаксиса:
http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-10.html
Это также определяет letrec, очень сложным способом, конечно, не так, как я бы его определил, я бы просто использовал:
(define-syntax letrec2
(syntax-rules ()
((letrec2 ((name val) ...) body bodies ...)
((lambda ()
(define name val) ...
body bodies ...)))))
Насколько я понимаю, семантика letrec, которую я очень часто использую в качестве именованного let. Это работает таким образом, однако, поскольку у меня была справедливая доля дискуссий с философами, которые думают, что они могут просто опровергнуть специальную теорию относительности или основанные фонологические теории, я знаю, что, когда вы думаете, что у вас есть простое решение сложной проблемы, это, вероятно, НЕПРАВИЛЬНО. Должен быть какой-то момент, когда этот макрос не защищает семантику letrec, иначе они, вероятно, использовали бы его.
В этом определении определения являются локальными для тела letrec, они могут ссылаться друг на друга для взаимной рекурсии, я не совсем уверен, что (если таковые имеются) не так.
4 ответа
Хорошо, я наконец-то нашел причину, это так же просто, как бесполезно, в моем определении нет ничего плохого, и это на самом деле из-за некоторых ошибок, превосходящих ошибку в R5RS.
http://community.schemewiki.org/?scheme-faq-macros
Ищите "letrec", вы все не могли бы ответить на мой вопрос о том, что было не так, очевидно, ничего плохого не было, у R5RS была "ошибка" в информативном разделе. Я буду вынужден принять свой собственный ответ сейчас, я думаю...
Теперь возникает вопрос: почему авторы R5RS не выбрали это простое решение и выбрали очень сложное, в котором даже была ошибка...
Мне кажется, что вы перенесли ответственность за реализацию с макроса на компилятор, чего, похоже, пытаются избежать разработчики R5RS.
Фактически локальные определения реализованы с помощью letrec в R5RS. См. 6.2.2 Внутренние определения.
Я думаю, что намерения дизайнеров хорошо представлены во введении к R5RS:
Языки программирования должны разрабатываться не путем добавления элементов поверх функций, а путем устранения недостатков и ограничений, которые делают дополнительные функции необходимыми. Схема демонстрирует, что очень небольшого числа правил для формирования выражений без ограничений на их составление достаточно для формирования практичного и эффективного языка программирования, который достаточно гибок, чтобы поддерживать большинство основных парадигм программирования, используемых сегодня.
edit1: пример внутренних определений, преобразованных в версию letrec для r5rs. PLT схема 4.2.5 собирает /r5rs/main.ss
(define-syntax (r5rs:body stx)
(syntax-case stx (let)
[(_ (let () . body))
#'(let () . body)]
[_
;; Convert internal definitions to `r5rs:letrec', as opposed
;; to `letrec'.
...
В схеме PLT в режиме R5RS внутренние преобразования преобразуются в версию letrec R5RS. Вы также можете проверить это самостоятельно, используя макроэкспандер DrScheme для любого кода с внутренними определениями.
R5RS утверждает, что семантика letrec
точно такие же, как и у внутренних определений. Смотрите раздел, посвященный последним, для деталей; Я цитирую фрагмент ключа ниже:
, содержащий внутренние определения, всегда можно преобразовать в полностью эквивалентный letrec
выражение.
Таким образом, определяя letrec
с точки зрения внутреннего определения просто сдвигает проблему вокруг.
Кроме того, я считаю, что проще определить letrec
макро и есть lambda
Desugar внутренний определяет в letrec
чем набивать весь этот сложный код в lambda
обработчик и сборка letrec
более того. Это не затрагивая вопрос о том, какая из этих форм является более симпатичной для введения взаимно рекурсивных привязок в области не верхнего уровня...;-)
Хороший вопрос.
Я думаю, что проблема с последовательностью define
это:
"Порядок вычисления выражений expr... не указан, поэтому программа не должна вычислять ссылку на любую из переменных, связанных выражением letrec, до того, как все значения будут вычислены"