6.4 表达式对象的求值

Keywords:

Next: ,Previous: More on evaluation,Up: Computing on the language

6.4 表达式对象的求值

模式为 "expression"的对象在Expression objects 有具体定义。它们和引用对象的列表非常相似。

     > ex <- expression(2 + 2, 3 + 4)

     > ex[[1]]

     2 + 2

     > ex[[2]]

     3 + 4

     > eval(ex)

     [1] 7

注意,对一个表达式对象求值会对每个调用依次求值,但是最终的值是最后一个引用的值。基于这种考虑,它的行为几乎和复合语言对象 quote({2 + 2; 3 + 4})完全一致。但也有一些细微的差别:调用对象在解析树里面不能和子表达式区分。这就说明它们是以子表达式一样的方式自动求值。表达式对象可以在求值过程中被识别,并且在某种意义上,保留了它们的引用。求值程序不会递归对一个表达式对象求值,仅仅当它如前面的例子一样直接传递给函数eval时求值。它们的差异可以通过下面的例子看出:

     > eval(substitute(mode(x), list(x = quote(2 + 2))))

     [1] "numeric"

     > eval(substitute(mode(x), list(x = expression(2 + 2))))

     [1] "expression"

语法分析器通过创建它的调用来描述一个表达式对象。这和处理数值向量和多个其它没有特别额外表示的对象的方法类似。但是,它会导致一些困惑:

     > e <- quote(expression(2 + 2))

     > e

     expression(2 + 2)

     > mode(e)

     [1] "call"

     > ee <- expression(2 + 2)

     > ee

     expression(2 + 2)

     > mode(ee)

     [1] "expression"

即, eee 在打印的时候看上去是一样的,但是其中一个是产生表达式对象的调用,而另外一个则是对象本身。

Hits:Loading...

special topic