【问题标题】:How do I evaluate a symbol in MIT Scheme?如何评估 MIT Scheme 中的符号?
【发布时间】:2018-01-24 19:08:08
【问题描述】:

我在 Scheme 中有以下内容:

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

这应该评估为 #t 但我收到一个错误:

the object null? is not applicable

我在其他 SO 问题中尝试了一些解决方案,但它们似乎都不起作用。

如何评估符号?

【问题讨论】:

标签: scheme lisp mit-scheme


【解决方案1】:

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

【讨论】:

  • ((add1))。简短的回答可能是:“你永远。(评估Scheme中的符号)。”
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多