想要区分价值和表达

时间:2016-01-07 03:57:51

标签: lisp expression

我想知道如何区分'值' '表达'

  

在计算机科学中,价值是一种不可能的表达   进一步评估(正常形式)。[1]一个类型的成员是   那种类型的价值。[1]例如,表达式1 + 2不是a   值可以减少到表达式3.这个表达式不能   可以进一步减少(并且是Nat类型的成员)因此   是一个价值。

我在下面的网址上找到了一条声明: https://en.wikipedia.org/wiki/Value_(computer_science) 2

从这句话我觉得:

  

我认为"价值"看起来像"原子"在化学基础上   Mitchell的定义,John C.

但有人否认了这一点:

  

但是,即使表达式也可以(表示为)值。经典案例   是一个类似Lisp语言的s表达式。 - user2864740

这个演讲是另一个话题:第一类价值是什么3

如果user2864740没有说什么,那就太简单了。但他这么说并且我很困惑。

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

提前谢谢!

[1] Mitchell,John C.(1996)。编程语言的基础。麻省理工学院出版社。

2 个答案:

答案 0 :(得分:3)

如果您不了解Lisp,请阅读SICP并参与Scheme实施。

(经典的SICP书是必读的 - 这是一本关于编程的非常好的入门书,所以即使你知道Lisp但没有读过SICP,你真的应该阅读它;它是免费在线提供。)

我强烈推荐阅读C.Queinnec的Lisp In Small Pieces一书,该书解释了LISP口译员或编纂者的表达方式是如何设计的,因此请将您的问题包含在内。

(实际上你的问题需要整本书才能得到解答,而Queinnec的书就是那本书)

LISP是一种homoiconic语言,因此s-expressions是值(但有几个值不是表达式,特别是closures)。但是大多数编程语言-C,Ocaml,Javascript,C ++,Java等......(遗憾地)都不是homoiconic:他们的AST 不是一个值,而表达式无法操纵AST < EM>原生

BTW,维基百科句子

  

值是一个无法进一步评估的表达式

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

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

另外,阅读Scott的Programming Language Pragmatics将为您提供更广泛的视图(通过几种编程语言)。

答案 1 :(得分:1)

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

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

表达式的目的可能是表示值的计算;在这种情况下,ANSI Common Lisp将表达式称为形式。并非所有表达都是表格。例如,在(let ((a 42)))中,(a 42)是一个表达式,在let的上下文中表示变量a及其初始化形式42和{{1表达式((a 42))下的绑定规范的完整列表。

如果对表单进行求值,并且结果是与该表单本身类似的数据,则两者之一就是这样:表单可能是 literal (一个对其自身求值的值)如果它被视为表达式)或者它可能是 quine :一个聪明的形式,它不会直接将自己作为一个值(文字的方式)但巧妙地计算一个对象在结构上与自身相同。

值不被定义为不可简化的表达并且表示自身;这是一个文字常数。文字常量表示值。但是,值存在于所有上下文中,例如语法不再相关的运行时上下文。当程序运行时,它可以实例化作为一段语法从未存在的值。如果我们评估(+ 2 2),那么在语法中从未出现过4作为表达式4.因此我们不能说值4是一个不可简化的表达式;即使没有这样的表达式,该值仍然存在。