'(a' b)给出答案(a' b)。当a(没有引用)没有绑定时,它是如何工作的。
答案 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)
。