我想知道如何区分'值' 和'表达' 。
在计算机科学中,价值是一种不可能的表达 进一步评估(正常形式)。[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)。编程语言的基础。麻省理工学院出版社。
答案 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是一个不可简化的表达式;即使没有这样的表达式,该值仍然存在。