如何在MIT Scheme中评估符号?

3

我有一个在Scheme中的以下代码:

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

应该返回 #t,但我却收到了一个错误消息:
the object null? is not applicable

我尝试了其他一些SO问题中的解决方案,但似乎都没有起作用。
如何评估符号?

1
我昨晚没睡好,所以我会简要地说:((car (list null? null?)) '()) - rsm
可能是将符号应用为过程的重复问题。 - bipll
2个回答

4

它不应该评估为#t。您正在混合符号和变量。第二个引用某些内容时,代码表示将成为数据。

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

那是一个包含两个符号的列表。它们与以下内容没有任何关系:noting
null? 
; ==> #<procedure:null?> (implementation dependent visualization)

当您评估变量null?时,会得到闭包对象。如果您想创建基本类型的关联数组,您需要使用listcons来避免引用变量,或者您需要使用quasiquote语法:

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

(add1)。简短的答案可能是:“你不需要。在Scheme中永远不要评估一个符号。” - Will Ness

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)”是同一件事。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接