Что, если таковые имеются, не так с этим определением letrec в Схеме? - PullRequest
5 голосов
/ 14 мая 2010

R5RS дает предлагаемые определения макросов для библиотечных форм синтаксиса:

http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-10.html#%_sec_7.3

Который также определяет letrec, очень сложным способом, конечно, не так, как я бы его определил, я просто использовал бы:

(define-syntax letrec2
  (syntax-rules ()
    ((letrec2 ((name val) ...) body bodies ...)
     ((lambda ()
       (define name val) ...
       body bodies ...)))))

Насколько я понимаю, семантика letrec, которую я очень часто использую в качестве именованного let. Это работает таким образом, однако, поскольку у меня была моя справедливая доля дискуссий с философами, которые думают, что они могут просто опровергнуть специальную теорию относительности или основанные фонологические теории, я знаю, что, когда вы думаете, что у вас есть простое решение сложной проблемы, это, вероятно, НЕПРАВИЛЬНО. Должен быть момент, когда этот макрос не защищает семантику letrec, иначе они, вероятно, использовали бы его.

В этом определении определения являются локальными по отношению к телу letrec, они могут ссылаться друг на друга для взаимной рекурсии, я не совсем уверен, что (если таковое имеется) неправильно.

Ответы [ 4 ]

5 голосов
/ 14 мая 2010

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

Фактически локальные определения реализованы с помощью letrec в R5RS.См. 6.2.2 Внутренние определения .

Я думаю, что намерения дизайнеров хорошо подытожены во введении к R5RS :

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

edit1: пример внутренних определений, преобразованных в версию letrec для r5rs.Схема PLT 4.2.5 collects / 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 для любого кода с внутренними определениями.

3 голосов
/ 15 мая 2010

R5RS утверждает, что семантика letrec точно такая же, как и у внутренних определений. См. раздел, посвященный последнему для деталей; Я цитирую фрагмент ключа ниже:

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

Таким образом, определение letrec в терминах внутренних определений просто решает проблему.

Кроме того, я считаю, что проще определить макрос letrec и иметь внутренние определения lambda desugar в letrec, чем вставлять весь этот сложный код в обработчик lambda и строить letrec поверх , Это не затрагивая вопрос о том, какая из этих форм является более симпатичной для введения взаимно рекурсивных привязок в области не верхнего уровня ...; -)

0 голосов
/ 07 июня 2010

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

http://community.schemewiki.org/?scheme-faq-macros

Ищите «letrec», вы все не могли бы ответить на мой вопрос о том, что было не так, очевидно, ничего плохого не было, у R5RS была «ошибка» в информативном разделе. Я буду вынужден принять свой собственный ответ, я думаю ...

Теперь возникает вопрос: почему авторы R5RS не выбрали это простое решение и выбрали очень сложное решение, в котором даже была ошибка ...

0 голосов
/ 14 мая 2010

Хороший вопрос.

Я думаю, что проблема с последовательностью define заключается в следующем:

«Порядок оценки выражения expr ... не указано, поэтому программа не должна оценивать ссылка на любую из переменных связаны выражением letrec перед все значения были вычислены "

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

...