为什么要区分表达式和语句

Voo*_*Voo 4 language-agnostic procedural-programming functional-programming

在函数式语言(实际上我用过的所有函数式语言)中,语句和表达式之间没有区别,每个代码块的最后一个值是块的"返回值".另一方面,通常不被认为是纯粹功能的语言通常会引入这种区别.

作为我正在谈论的一个例子,以下python代码打印None:

def foo():
    5 + 5
print(foo())
Run Code Online (Sandbox Code Playgroud)

而方案代码打印 10

(define (foo) (+ 5 5))
(display (foo))
Run Code Online (Sandbox Code Playgroud)

显然,我对那些喜欢一种风格的人的主观答案不感兴趣,而是客观原因.

对我而言,这种区别似乎使得语言的语法和实现更加复杂(一个不那么明显的例子就是模板和void类型的c ++标准中的必要例外,或者引入了"快捷方式if语句",比如?c - 受影响的语言)没有真正的好处 - 但很可能有一个原因,即使是新的现代语言仍然有这种区别.

Don*_*art 5

无处不在的副作用.

如果你是一个纯粹的功能语言,一切都是表达.即使是"陈述"也会返回类似的东西()(可能因其类型而异,例如IO ().

但是,大多数编程语言默认允许在任何地方或任何地方使用效果,因此排序成为关键,因此您可以使用特殊语法来为计算机排序语句,通常用分号分隔.

纯表达式不是这种情况,纯表达式可以按任何保留表达式语义的顺序进行计算.

副作用动作被认为是特殊的表达式,它们可以获得特殊的语法.