如何评估麻省理工学院计划中的符号?

时间:2018-01-24 19:08:08

标签: scheme lisp mit-scheme

我在Scheme中有以下内容:

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

应评估为#t但我收到错误:

the object null? is not applicable

我尝试了其他SO问题中的一些解决方案,但它们似乎都没有用。

如何评估符号?

2 个答案:

答案 0 :(得分:4)

它不应评估为#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))

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