Как насчет того, чтобы язык предоставлял как вызов по имени, так и вызов по значению? - PullRequest
4 голосов
/ 27 февраля 2011

Нормально ли, что язык обеспечивает стратегию оценки как по требованию (CBN), так и по запросу (CBV)? Я имею в виду, не исправляя это и не симулируя одно другое, но позволяя пользователю выбирать, когда это необходимо. Например, пусть язык имеет функцию eval, как в доступной Схеме, которая может принять еще один аргумент от пользователя, указывающий, какую стратегию оценки он хочет.

1 Ответ

6 голосов
/ 27 февраля 2011

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

Анализ строгости используется на ленивых (CBN) функциональных языках для определения того, когда функции можно безопасно оценить с помощью стратегии CBV.Оценка CBV обычно выполняется быстрее, но использование этой стратегии оценки для нестрогих функций меняет семантику программы.

Wadler описывает, как комбинировать ленивые и строгие вычисления на функциональном языке.

лямбда-нить thread также решает проблему.

Scala имеет ключевое слово lazy для указания того, что определенные вычисления должны быть выполненылениво.Другие языки имеют аналогичные конструкции.

...