【发布时间】:2016-02-20 03:55:57
【问题描述】:
我对@987654324@ 登录球拍的含义有些困惑。在我看来,同一个符号有不同的含义。看下面两个简单的例子:
返回一个新分配的列表,其中包含 vs 作为其元素。
> (list 1 2 3 4)
'(1 2 3 4)
产生一个与 datum 对应的常量值(即程序片段的表示),没有其词法信息、源位置等。引号对、向量和框是不可变的。
> '(1 2 3 4)
'(1 2 3 4)
所以我的问题是:
' 符号是否有 2 个含义(一个 符号 和一个 list)或者它们是相同的数据类型,list 实际上返回一个 引用的常量值?如果是第二种情况,为什么这样做:
> '(+ (- 2 13) 11)
'(+ (- 2 13) 11)
> (eval (list + (- 2 13) 11))
0
(同样(eval '(+ (- 2 13) 11)) 工作并正确评估为0)
但这不是:
> (list + (- 2 13) 11)
'(#<procedure:+> -11 11)
> (eval '(#<procedure:+> -11 11))
. read: bad syntax `#<'
【问题讨论】:
-
(eval '(#<procedure:+> -11 11))不起作用的原因是#<procedure:+>不能被读回。但是,使用 quasiquote 和 unquote,(eval (quasiquote ((unquote +) -11 11)))有效。使用写成(eval `(,+ -11 11))的简写。
标签: functional-programming scheme racket quote repl-printed-representation