想要区分价值和表达

Want to distinguish between value and expression

我想知道如何区分 'value''expression'.

In computer science, a value is an expression which cannot be evaluated any further (a normal form).[1] The members of a type are the values of that type.[1] For example, the expression 1 + 2 is not a value as it can be reduced to the expression 3. This expression cannot be reduced any further (and is a member of the type Nat) and therefore is a value.

我从下面的 url 中找到了上面的语句: https://en.wikipedia.org/wiki/Value_(computer_science) 2

从这句话我觉得:

I think "value" look like the "atom" in chemistry based upon the definition of Mitchell, John C.

但有人否认了这一点:

But, even expressions can be (represented as) values. The classic case being an s-expression in Lisp-like languages. – user2864740

这个话题在另一个线程中:what-is-the-value-in-1st-class-value 3

要是user2864740什么都不说就好了。可他这么说,我一头雾水。

有人可以向我解释一下这种情况吗?或 lisp 语言中可能存在的差异?

提前致谢!

[1] 约翰·C·米切尔 (1996)。编程语言基础。麻省理工学院出版社。

如果您不了解 Lisp,请阅读 SICP and play with some Scheme 实现。

(经典的 SICP 书是必读的 - 这是一本非常好的编程入门书籍 - 所以即使你知道 Lisp 但没有读过 SICP 你真的应该读一读;和它是免费提供的 on-line.)

我强烈推荐阅读 C.Queinnec 的 Lisp In Small Pieces 书,这本书解释了 LISP 解释器或编译器表达式是如何设计的,所以涵盖你的问题非常详细。

(其实你的问题需要整本书才能回答,Queinnec的书就是那本书)

LISP 是一个 homoiconic language, hence s-expressions are values (but several values are not expressions, in particular closures). But most programming languages -C, Ocaml, Javascript, C++, Java, etc...- are (sadly) not homoiconic: their AST 不是 一个值,表达式不能 本机

顺便说一句,维基百科的句子

a value is an expression which cannot be evaluated any further

并不总是正确的。例如,对于 C 语言,值和表达式是不同种类的野兽。

您还应该阅读一些有关 formal semantics 编程语言的内容。

此外,阅读 Scott 的 Programming Language Pragmatics 会给你一个更广阔的视野(通过 几种 编程语言)。

值是一个数据:一些信息的机器表示,例如数字或字符串。该数据属于 type,它具有关联的 domain:作为该类型所有可能值的集合。该值是该集合的一个元素。

表达式是表示语法的数据:通常是结构化数据构建为其他值的聚合(通常是树结构)。但是,单个 non-aggregated 值也可以是表达式。

表达式的目的可能是表示值的计算;在那种情况下,ANSI Common Lisp 将表达式称为 形式 。并非所有表达式都是形式。例如在(let ((a 42)))中,(a 42)是一个表达式,在let的上下文中表示变量a及其初始化形式42,而((a 42)) 是一个表达式,表示 let.

下的绑定规范的完整列表

如果对一个表格求值,结果是一个与该表格本身相似的数据,则属于两种情况之一:该表格可能是一个文字(一个如果它被视为一个表达式,它的计算结果就是它自己)或者它可能是一个 quine:一种聪明的形式,它不会直接将自己作为一个值产生(就像文字那样)而是巧妙地计算出一个结构上与自身相同的对象。

一个值没有被定义为一个表达式,它是不可约的并且表示它自己;那是一个文字常量。文字常量 表示 一个值。但是,值存在于所有上下文中,例如语法不再相关的 run-time 上下文。当程序是 运行 时,它可以实例化永远不存在的值作为一段语法。如果我们计算 (+ 2 2),有一个 4 从未作为表达式 4 出现在语法中。因此我们不能说值 4 是一个不可约的表达式;即使没有这样的表达式,该值也存在。