Что, если таковые имеются, не так с этим определением 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, до того, как все значения будут вычислены"

Здесь: http://www.scheme.com/tspl4/binding.html

Другие вопросы по тегам