В чем разница между letrec, letrec * из R6RS и letrec из Racket?

И letrec, и letrec* находятся в R6RS, но есть только letrec в Racket, не letrec*. В чем разница между ними?


person Ben    schedule 07.12.2013    source источник


Ответы (1)


Короче Racket letrec и R6RS letrec* это одно и то же. Для них указан порядок оценки. В R5RS letrec порядок не указан.

Поскольку порядок R5RS letrec не указан, реализация может выбрать фиксированный порядок (например, слева направо) или позволить компилятору выбирать разные порядки для каждого использования (чтобы получить более быстрый код).

Из документации Racket.

R5RS letrec:

Семантика: ‹переменные> привязаны к новым местоположениям, содержащим неопределенные значения,‹ init> оцениваются в результирующей среде (в некотором неопределенном порядке), каждая ‹переменная> присваивается результату соответствующего‹ init>, ‹body> оценивается в результирующей среде, и значение (я) последнего выражения в‹ body> возвращается (возвращаются). Каждая привязка ‹переменной> имеет в качестве области все выражение letrec, что позволяет определять взаимно рекурсивные процедуры.

Racket letrec:

Подобно let, включая оценку val-exprs слева направо, но сначала создаются местоположения для всех идентификаторов и заполняются # ‹undefined>, все идентификаторы связаны во всех val-exprs, а также в телах, и каждый id устанавливается сразу после вычисления соответствующего val-expr. Идентификаторы должны отличаться в соответствии с bound-identifier = ?.

R6RS letrec*:

Семантика: ‹переменные> привязаны к новым местоположениям, каждая‹ переменная> присваивается в порядке слева направо результату оценки соответствующего ‹init>, тело‹ оценивается в результирующей среде, а возвращаются значения последнего выражения в ‹body>. Несмотря на порядок вычисления и присваивания слева направо, каждая привязка переменной ‹> имеет все выражение letrec * в качестве своей области, что позволяет определять взаимно рекурсивные процедуры.

person soegaard    schedule 07.12.2013
comment
Для полноты вы можете добавить семантику R7RS, поскольку R7RS теперь является официальным. - person GoZoner; 07.12.2013
comment
Насколько я могу судить, значения letrec и letrec * в R7RS не претерпели изменений. То есть letrec в R7RS имеет то же значение, что и в R5RS и R6RS. В R7RS letrec * имеет то же значение, что и в R6RS. - person soegaard; 08.12.2013