作为使用JavaScript进行编程的过程,我注意到使用语句可以完成的所有事情,而使用单独的表达式可以完成块。编程语言仅可以使用表达式工作吗?而且,如果可以,为什么还要使用语句?
作为使用JavaScript进行编程的过程,我注意到使用语句可以完成的所有事情,而使用单独的表达式可以完成块。编程语言仅可以使用表达式工作吗?而且,如果可以,为什么还要使用语句?
Answers:
当然。最简单的方法是将结果值分配给当前是语句的每个构造,从而将其转换为表达式。不过,这不一定有用或有意义。唯一的潜在收益就是概念上的简化。但是,如果您随后删除分号和循环之类的内容(而是要求通过其他运算符和函数链接),则大量使用语句的程序将变得很丑陋。
一种更根本的但有意义的方法是设计语言,使几乎所有内容都具有有意义的值,并以几乎始终为该有意义的值而不是其他效果使用表达式的方式使用它。函数式编程语言执行此操作(在某种程度上;例如,Haskell具有声明,而不是表达式)。
之所以使用语句,是因为在命令式范例中,有许多常见的操作没有有用的结果值,并且因为顺序指令(而不是计算)的概念非常适合该范例。如果您的程序中有很大一部分是在改变状态,而不是在计算新值,则要求产生一个值(for循环的结果是什么)没有任何意义。相反,当整个范式(FP)围绕值的计算建立时,没有结果值的离群值不会保证例外:相反,您给他们提供了不重要的定点结果。
取决于您如何定义“语句”和“表达式”。
一个非常严格的定义会将“有副作用,可能有返回值的事物”与“有返回值但不能有副作用的事物”的表达式区分开。使用这样的定义,如果没有至少一个语句(必须评估一个表达式并输出其返回值),就无法编写有意义的程序-单纯的表达式无法与程序外部的世界进行交互。如果将不纯部分移出语言并进入支持的生态系统(尽管该语言具有定义和表达方式,这正是Haskell所做的事情),那么仅一种语言仍然可以是完全纯净的(即,没有任何陈述)。 。
但是,如果允许在表达式中产生副作用,则语句和表达式之间的区别将变得任意且有趣得多-当然,您可以发明一种仅由表达式组成的编程语言。大多数Lisp方言都是这样工作的。在这种情况下,评估表达式的副作用与执行语句几乎完全相同,并且有人可能会争辩说,在这种语言中,表达式和语句是同一回事。因此,语句和表达式之间的区别只是语法上的。
许多语言仍然在语法上有所区别,因为它不是出于技术原因而是出于可读性而有用。使某个表达式成为表达式表示您对它的返回值感兴趣,而对它的副作用则更少。声明会告诉读者您打算引起副作用,并且返回值可能有趣,也可能不有趣。
是。
功能语言(和单一赋值语言)的一切都是表达。例如Haskal(和SISAL)。其中if语句和for循环均返回值。
语言还有其他几类:想到的最简单的一种是声明性语言(我相信还有很多其他语言不依赖于语句)。这些语言甚至不需要表达式(与您通常认为的含义相同)。您声明什么是正确的,然后可以获得多个结果。这里最简单的是prolog
。