我如何评估 MIT Scheme 中的符号?

How do I evaluate a symbol in MIT Scheme?

我在 Scheme 中有以下内容:

((car '(null? null?)) ())

计算结果应为#t,但出现错误:

the object null? is not applicable

我尝试了其他 SO 问题中的一些解决方案,但其中 none 似乎有效。

如何评估交易品种?

它不应计算为 #t。您正在混合符号和变量。第二个你引用的东西是代码表示,它变成了数据。

'(null? null?)
; ==> (null? null?)

这是一个包含两个符号的列表。他们 注意到 与:

null? 
; ==> #<procedure:null?> (implementation dependent visualization)

当您评估 变量 null? 时,您将获得闭包对象。如果你想创建一个基元关联,你需要使用 listcons 来不引用变量或者你需要使用 quasiquote-syntax:

(define *primitives* 
  `((null? . ,null?)
    (car . ,car) 
    (cdr . ,cdr)))

这只是使用 listcons 的语法糖。 当您对此进行评估时,您会注意到右侧不是符号:

*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))

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) 是一回事