Чистый язык программирования по-видимому, основан на перезаписи терминов, вместо лямбда-исчисления, традиционно лежащего в основе аналогичных языков.
... Какая качественная, практическая разница делает это? В самом деле, какова разница в том, как он оценивает выражения?
Связанная страница содержит много примеров перезаписи терминов, которые могут быть полезны, но на самом деле она не описывает то, что она делает иначе, чем приложение-функция, за исключением того, что она имеет довольно гибкое сопоставление шаблонов (и сопоставление шаблонов, как оно появляется в Haskell и ML - хороший, но не фундаментальный для стратегии оценки). Значения сопоставляются с левой стороной определения и подставляются в правую сторону - это не просто бета-сокращение?
Совпадение шаблонов и подстановка в выходные выражения поверхностно выглядит мне как syntax-rules
мне (или даже скромному #define
), но главная особенность этого заключается в том, что это происходит раньше, чем во время оценки, в то время как Pure полностью динамичен, и в его оценочной системе нет очевидного разделения фаз (а на самом деле макросистемы Lisp всегда делали большой шум о том, как они не отличаются от приложения-функции). Возможность манипулировать символическими значениями выражения является "cool'n'all", но также кажется артефактом системы динамического типа, а не чем-то основным для стратегии оценки (довольно уверен, что вы можете перегружать операторов в Scheme для работы с символическими значениями, на самом деле вы даже можете сделать это на С++ с шаблонами выражений).
Итак, какова механическая/операционная разница между переписыванием терминов (как используется Pure) и традиционным функциональным приложением в качестве базовой модели оценки, когда замещение происходит в обоих?