我正在研究 4.1.4 Running the Evaluator as a Program 的元循环计算器,使用 Racket 构建它:
I'm working on metacircular evaluator of 4.1.4 Running the Evaluator as a Program, building which with Racket:
#lang racket (require (combine-in rnrs/base-6 rnrs/mutable-pairs-6)) (define (evaluate exp) (cond ; ... ((definition? exp) (display exp) (display " is a definition\n")) ; ... (else (display exp) (display " is something else\n")))) (define (definition? exp) (tagged-list? exp 'define)) (define (tagged-list? exp tag) (if (pair? exp) (eq? (car exp) tag) false)) (define (driver-loop) (let ((input (read))) (let ((output (evaluate input))) output)) (driver-loop)) (driver-loop)在成功读取DrRacket中的输入框后,我输入(define a 0),结果是:
After getting a box that reads input in DrRacket successfully, I type in (define a 0) and it turn out:
(定义一个 0)是别的东西
如果我删除它可以被识别
It could be recognised if I remove
(require (combine-in rnrs/base-6 rnrs/mutable-pairs-6))但没有它我将无法调用 set-car! 或 set-cdr!.set- 函数有替代方法吗?
But without which I wouldn't be able to call set-car! or set-cdr!. Is there an alternative for set- function?
或者我可以选择从 rnrs/base-6 和 rnrs/mutable-pairs-6 导入什么?
Or could I choose what to import from rnrs/base-6 and rnrs/mutable-pairs-6 ?
推荐答案这里是错误:
(require (combine-in rnrs/base-6 rnrs/mutable-pairs-6))包 rnrs/base-6 和 rnrs/mutable-pairs-6 带来了一些不可预测的变化 cons(以及 car, cdr) 前导 (define a 0) 没有被 definition 捕获?
Package rnrs/base-6 and rnrs/mutable-pairs-6 bring in something unpredicted that change cons(as well as car, cdr) leading (define a 0) not been caught by definition?
解决方案:
(require (only-in (combine-in rnrs/base-6 rnrs/mutable-pairs-6) set-car! set-cdr!))始终将 only-in 放在 require 中以避免任何不需要的绑定.
Always put only-in in require to avoid any unwanted binding.
更多推荐
使用 Racket 实现 SICP 评估器
发布评论