我在Scheme中有以下内容:
((car '(null? null?)) ())
应评估为#t但我收到错误:
the object null? is not applicable
我尝试了其他SO问题中的一些解决方案,但它们似乎都没有用。
如何评估符号?
答案 0 :(得分:4)
它不应评估为#t
。你正在混合符号和变量。第二个你引用的东西是它成为数据的代码表示。
'(null? null?)
; ==> (null? null?)
这是一个包含两个符号的列表。他们注意与:
null?
; ==> #<procedure:null?> (implementation dependent visualization)
评估变量 null?
时,会得到闭包对象。如果要创建基元关联,则需要使用list
或cons
来引用变量,或者需要使用quasiquote-syntax:
(define *primitives*
`((null? . ,null?)
(car . ,car)
(cdr . ,cdr)))
这只是使用list
和cons
的语法糖。
当你评价这个时,你会注意到右边不是符号:
*primitives*
; ==> ((null? . #<procedure:null?>)
; (car . #<procedure:car>)
; (cdr . #<procedure:cdr>))
再次。程序的可视化不同。以下是如何使用它:
(define prim 'car)
(let ((found (assq prim *primitives*)))
(if found
((cdr found) '(1 2 3))
'signal-error))
答案 1 :(得分:0)
Sylwester的答案显示了理解问题的正确方法。我会尽量使它变得更简单。
(i)每个函数都会出现问题,而不仅仅是函数“null?”。
(define (square x) (* x x))
((car '(square square) 2) ---> The object square is not applicable.
((car (list square square) 2) ---> 4
(ii)将问题简化为更简单的表达方式:
(car '(square)) ---> square
(car (list square)) ---> (#[compound-procedure 20 square])
(symbol? (car '(square))) ---> #t
(procedure? (car (list square))) ---> #t
(iii)在阅读你的问题和sylwester的回答之前,我想到了 '(square)和(list square)是一回事。