没有语句,编程语言也可以工作吗?


9

作为使用JavaScript进行编程的过程,我注意到使用语句可以完成的所有事情,而使用单独的表达式可以完成块。编程语言仅可以使用表达式工作吗?而且,如果可以,为什么还要使用语句?


2
是的,有许多种都是表达语言,例如Ruby和Lisp的所有方言。
amara 2012年

@sparkleshy我看到了,只是一个猜测:它们都有一个类似于JavaScript逗号的运算符(它执行两个语句并返回最后一个的值)?通常,这是按顺序执行两个语句的解决方案吗?我猜我将CL的progn算作一个模拟,即使它适用于> 2个表达式。
MaiaVictor 2012年

1
一切都是表达,看上去不必像普通的语句语言一样,语句只是具有值。如果您使用javascript的语句表达式,则所有现有代码将完全有效。
amara 2012年

1
CoffeeScript是一种一切即表达的语言,可以编译为JavaScript。
Spoike 2012年

1
相关(可能是重复的):在表达式不是陈述的语言中,没有什么有用的表达能力? “为什么这么多的语法在答案中指出时将expr和stmt区分开来,却毫无意义。”
蚊蚋

Answers:


14

当然。最简单的方法是将结果值分配给当前是语句的每个构造,从而将其转换为表达式。不过,这不一定有用或有意义。唯一的潜在收益就是概念上的简化。但是,如果您随后删除分号和循环之类的内容(而是要求通过其他运算符和函数链接),则大量使用语句的程序将变得很丑陋。

一种更根本的但有意义的方法是设计语言,使几乎所有内容都具有有意义的值,并以几乎始终为该有意义的值而不是其他效果使用表达式的方式使用它。函数式编程语言执行此操作(在某种程度上;例如,Haskell具有声明,而不是表达式)。

之所以使用语句,是因为在命令式范例中,有许多常见的操作没有有用的结果值,并且因为顺序指令(而不是计算)的概念非常适合该范例。如果您的程序中有很大一部分是在改变状态,而不是在计算新值,则要求产生一个值(for循环的结果是什么)没有任何意义。相反,当整个范式(FP)围绕值的计算建立时,没有结果值的离群值不会保证例外:相反,您给他们提供了不重要的定点结果。


-1这不是真的
amara 2012年

3
@sparkleshy哪一部分不正确,如何?

1
第一段:您怀疑语句具有有用的返回值(但是很多返回值)的想法,提出了一个丑陋的东西(为什么?)。第二段:声明所有函数式编程语言都使用这种丑陋的概念,这很荒谬。第三段:错误,我们已经在{}块中,该值被忽略并且不会引起任何问题,这是不正确的;您已经给了他们缺少void的值,那么null的意义如何呢?总的来说:这不是真的
amara 2012年

2
@sparkleshy-没有语句具有有用的返回值,这就是为什么它们是statement的原因。它们可能有有用的副作用(例如赋值),但这不是一回事。这实际上不是一个附带概念。如果达到N级,这不是完全实用的,这是众所周知的。这个哨兵值不为null或void,它是单位,两者之间有细微的差别。+1使delnan弥补了这一点。
Telastyn

4
@sparkleshy(1)您可能将表达式(可能是语句的唯一组成部分)与语句(不是表达式且没有结果值)相混淆。(2)什么?任何计划生育倡导者都会确认这一点(并认为这是一件好事)。还是仅仅是您反对的“全部”部分?(3){}块就是我在说的(“顺序指令的概念”)。我在哪里说什么会引起任何问题?voidnull/ 之间的区别在于unit后者是值并且可以传递,而void特殊之处在于没有该类型的值。

5

取决于您如何定义“语句”和“表达式”。

一个非常严格的定义会将“有副作用,可能有返回值的事物”与“有返回值但不能有副作用的事物”的表达式区分开。使用这样的定义,如果没有至少一个语句(必须评估一个表达式并输出其返回值),就无法编写有意义的程序-单纯的表达式无法与程序外部的世界进行交互。如果将不纯部分移出语言并进入支持的生态系统(尽管该语言具有定义和表达方式,这正是Haskell所做的事情),那么仅一种语言仍然可以是完全纯净的(即,没有任何陈述)。 。

但是,如果允许在表达式中产生副作用,则语句和表达式之间的区别将变得任意且有趣得多-当然,您可以发明一种仅由表达式组成的编程语言。大多数Lisp方言都是这样工作的。在这种情况下,评估表达式的副作用与执行语句几乎完全相同,并且有人可能会争辩说,在这种语言中,表达式和语句是同一回事。因此,语句和表达式之间的区别只是语法上的。

许多语言仍然在语法上有所区别,因为它不是出于技术原因而是出于可读性而有用。使某个表达式成为表达式表示您对它的返回值感兴趣,而对它的副作用则更少。声明会告诉读者您打算引起副作用,并且返回值可能有趣,也可能不有趣。


+1关于可读性的评论...最终,人类需要理解它……
mattnz

1

ATLXtend是运行良好的无语句编程语言。许多功能语言也无需声明。所以,是的,没有语句,编程语言可以正常工作。我认为语句在许多语言中都是命令式编程的产物。由于它们广为人知并且在某些情况下使代码更具可读性,因此仍在使用它们。


1

是。

功能语言(和单一赋值语言)的一切都是表达。例如Haskal(和SISAL)。其中if语句和for循环均返回值。

语言还有其他几类:想到的最简单的一种是声明性语言(我相信还有很多其他语言不依赖于语句)。这些语言甚至不需要表达式(与您通常认为的含义相同)。您声明什么是正确的,然后可以获得多个结果。这里最简单的是prolog


Haskell有声明,它们不是表达式。
Janus Troelsen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.