【发布时间】:2014-06-20 15:35:21
【问题描述】:
纯编程语言是apparently based on term rewriting,而不是传统上作为外观相似语言基础的 lambda 演算。
...这有什么定性和实际的区别?事实上,是它评估表达式的方式有什么不同?
链接页面提供了很多术语重写的示例有用,但它实际上并没有描述它与函数应用程序的不同之处,只是它具有相当灵活的模式匹配(和出现在 Haskell 和 ML 中的模式匹配很好,但不是评估策略的基础)。值与定义的左侧匹配并替换到右侧 - 这不只是 beta 减少吗?
模式的匹配和替换为输出表达式,在我看来有点像syntax-rules(甚至是不起眼的#define),但主要特点显然是它发生在之前 而不是在评估期间,而 Pure 是完全动态的,并且在其评估系统中没有明显的相分离(事实上,Lisp 宏系统总是对它们的运行方式发出很大的噪音不与功能应用不同)。能够操作符号表达式值很酷,但也似乎是动态类型系统的产物,而不是评估策略的核心(很确定您可以在 Scheme 中重载运算符以处理符号值;事实上you can even do it in C++ 带有表达式模板)。
那么当替换发生在两者中时,术语重写(Pure 使用的)和传统函数应用程序(作为评估的基础模型)之间的机械/操作差异是什么?
【问题讨论】:
-
@GuyCoder 除其他外,强调问题的工程方面(“它实际上在做什么?”),因为我不是——现在仍然不是——有信心理解科学(“这是什么意思?”)观点。
-
Lambda 只是术语重写的一种特定形式 eval [(λx -> '(+ 1 x)) 5] = replace x by 5 in '(+ 1 x) ,为什么不概括它实现效果系统、线性类型和出色的模式匹配。
标签: functional-programming evaluation rewriting