我有一个在Scheme中的以下代码:
((car '(null? null?)) ())
应该返回 #t,但我却收到了一个错误消息:
the object null? is not applicable
我尝试了其他一些SO问题中的解决方案,但似乎都没有起作用。
如何评估符号?
我有一个在Scheme中的以下代码:
((car '(null? null?)) ())
the object null? is not applicable
它不应该评估为#t
。您正在混合符号和变量。第二个引用某些内容时,代码表示将成为数据。
'(null? null?)
; ==> (null? null?)
null?
; ==> #<procedure:null?> (implementation dependent visualization)
当您评估变量null?
时,会得到闭包对象。如果您想创建基本类型的关联数组,您需要使用list
或cons
来避免引用变量,或者您需要使用quasiquote语法:
(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))
(define (square x) (* x x))
((car '(square square) 2) ---> The object square is not applicable.
((car (list square square) 2) ---> 4
(car '(square)) ---> square
(car (list square)) ---> (#[compound-procedure 20 square])
(symbol? (car '(square))) ---> #t
(procedure? (car (list square))) ---> #t
((car (list null? null?)) '())
- rsm