我如何评估 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?
时,您将获得闭包对象。如果你想创建一个基元关联,你需要使用 list
或 cons
来不引用变量或者你需要使用 quasiquote-syntax:
(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))
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) 是一回事
我在 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?
时,您将获得闭包对象。如果你想创建一个基元关联,你需要使用 list
或 cons
来不引用变量或者你需要使用 quasiquote-syntax:
(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))
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) 是一回事