Chicken Scheme中是否存在支持符号的列表简写语法?
关于Chicken Scheme中列表引用与简写的疑问解答
嘿,我来帮你理清这个问题~首先得纠正一个小误解:你完全可以用'(some-symbol)来得到包含符号some-symbol的列表,它和(list 'some-symbol)的结果是完全一致的!你之前的困惑应该是把'(some-symbol)和'('some-symbol)搞混了,咱们来拆解下这几个写法的本质:
先搞懂'的本质
'expr是(quote expr)的语法糖,作用是原样返回expr,不对它求值。所以:
'(1 2 3)→ 等价于(quote (1 2 3)),返回列表(1 2 3),这和你看到的一致。'some-symbol→ 等价于(quote some-symbol),返回符号some-symbol,没错。'('some-symbol)→ 等价于(quote (quote some-symbol)),外层的quote把整个内层的(quote some-symbol)都原样保留了,所以结果是((quote some-symbol)),这就是你看到的嵌套列表。- 而
'(some-symbol)→ 等价于(quote (some-symbol)),直接返回包含符号some-symbol的列表(some-symbol),和(list 'some-symbol)的结果一模一样!
所以你之前的疑问里,并不是'(some-symbol)不行,而是误用了嵌套的'写法才得到了意外的结果。
那些你可能遗漏的列表相关简写
除了'(quote)之外,Scheme还有几个常用的列表操作简写,在处理需要部分求值的列表时特别好用:
`expr:是(quasiquote expr)的简写,也就是准引用。它和quote类似,但允许你在引用的内容里标记部分表达式进行求值。比如:(define x 2) `(1 ,x 3) ; 返回 (1 2 3),expr:是(unquote expr)的简写,必须配合准引用使用,用来标记需要求值的部分,上面的例子里已经用到了。,@expr:是(unquote-splicing expr)的简写,同样配合准引用,它会把一个列表的元素直接“拼接”到当前列表中,比如:(define lst '(2 3)) `(1 ,@lst 4) ; 返回 (1 2 3 4)
另外,'()是空列表的简写,不过直接写()也完全没问题,效果一致。
内容的提问来源于stack exchange,提问作者LunchMarble
相关产品推荐
相关产品推荐

