如何解释方案表达式'(a' b)

时间:2014-06-21 14:03:54

标签: functional-programming scheme

'(a' b)给出答案(a' b)。当a(没有引用)没有绑定时,它是如何工作的。

3 个答案:

答案 0 :(得分:3)

当我们评估表达式时会发生这种情况:

'(a 'b)
=> (a 'b)

'引用是quote特殊表单的简写,有关详细信息,请参阅链接文档:

(quote (a 'b))
=> (a 'b)

正如您所看到的,它可以防止引用的参数被评估,因此a未定义是不重要的,因为a不会被解释为引用表达式中的变量。如果我们尝试构建这样的列表,那就不一样了:

(list a 'b)

上面会产生错误,因为a是一个未定义的变量,而b是一个带引号的表达式。但这会起作用 - 因为列表中的两个元素都被引用:

(list 'a 'b)
=> (a b)

以下是构建问题所示列表的另一种方法:

(list 'a ''b)
=> (a 'b)

答案 1 :(得分:2)

列表表达式前缀的引号可防止对组件进行评估。如果你要写,比如说(列出一个' b),如果没有约束,你就会遇到问题。

答案 2 :(得分:2)

'something(quote something)的语法糖。

所以'(a 'b)(quote (a (quote b)))

quote不是函数;它是一种特殊的形式,它将文字表达式转换为右侧的运行时结构,看起来就像那个表达式。

  • 引用数字或字符串文字将评估为与该文字相同:(quote 42)评估为42
  • 引用标识符将生成一个符号:(quote apple)的评估结果与(string->symbol "apple")相同
  • 引用带括号的表单将生成一个列表,其元素是引用括号中每个项目的结果:(quote (x 5 (a b)))计算为(list (quote x) (quote 5) (quote (a b)))

(quote (a (quote b)))中,第二个"引用"没有特别处理任何其他标识符,因为第一个引用的右侧是字面上的,并且没有一个被评估为Scheme代码。

因此,(quote (a (quote b)))评估与(list (string->symbol "a") (list (string->symbol "quote") (string->symbol "b")))相同。换句话说,它是2个元素的列表,第一个是符号" a",第二个是另外两个元素的列表,第一个是符号&# 34;引用",第二个是符号" b"。

然后我们必须了解Scheme REPL如何打印出值。

  • 当值为列表时,它会打印括号(( )),并在其中列出每个列表项的递归打印结果。
  • 当值为符号时,它会打印符号的字符串。
  • 作为一个特例,如果它会打印(quote something)(如果它打印的是2个元素的列表会发生这种情况,第一个是符号"引用"),它将改为打印'something

因此,上述列表(如果不是例外情况将打印为(a (quote b)))将实际打印为(a 'b)