В чем разница между R6RS `letrec`, `letrec*`и Racket`letrec`?
И то и другое letrec
а также letrec*
в R6RS, но есть только letrec
в ракетке нет letrec*
, Каковы различия между ними?
1 ответ
Короче Ракетка letrec
и R6RS letrec*
та же. Для них указан порядок оценки. В R5RS letrec
заказ не указан.
С момента заказа R5RS letrec
В неопределенной реализации можно выбрать фиксированный порядок (например, слева направо) или они могут позволить компилятору выбирать разные порядки для каждого использования (для того, чтобы получить более быстрый код).
Из документации по ракетке.
Семантика:
связаны с новыми местоположениями, содержащими неопределенные значения, оцениваются в результирующей среде (в некотором неопределенном порядке), каждая присваивается результату соответствующего , вычисляется в результирующей среде, и возвращается значение (значения) последнего выражения в . Каждая привязка имеет полное выражение letrec в качестве своей области, что позволяет определять взаимно рекурсивные процедуры.
Как и let, включая оценку значений val-exprs слева направо, но местоположения для всех идентификаторов создаются первыми и заполняются #
, все идентификаторы связаны во всех выражениях val, а также в bodys, и каждый Идентификатор устанавливается сразу после оценки соответствующего val-expr. Идентификаторы должны быть различны в соответствии с bound-identifier =?.
R6RSletrec*
:
Семантика:
связаны с новыми местоположениями, каждая назначается в порядке слева направо результату оценки соответствующего , оценивается в результирующей среде, и значения последнего выражения в возвращаются. Несмотря на слева-направо оценку и порядок присваивания, каждая привязка имеет полное выражение letrec* в качестве своей области, что позволяет определять взаимно рекурсивные процедуры.