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

И то и другое letrec а также letrec* в R6RS, но есть только letrec в ракетке нет letrec*, Каковы различия между ними?

1 ответ

Решение

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

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

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

R5RS letrec:

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

Ракетка Летрек:

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

R6RSletrec*:

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

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