为何make-register需接收寄存器名称参数?
关于SICP中
make-register参数省略的问题 在SICP的§5.2.1章节中,定义的寄存器创建函数make-register如下:
(define (make-register name) (let ((contents '*unassigned*)) (define (dispatch message) (cond ((eq? message 'get) contents) ((eq? message 'set) (lambda (value) (set! contents value))) (else (error "Unknown request -- REGISTER" message)))) dispatch))
可以看到这个函数的name参数在函数体内完全未被使用,但实际调用时(比如在make-new-machine函数中)都会传入'pc'、'flag'这类名称:
(define (make-new-machine) (let ((pc (make-register 'pc)) (flag (make-register 'flag)) (stack (make-stack)) ; ...
问题
如果省略name参数,改成无参调用make-register是否会产生区别?
回答
从当前给出的代码逻辑来看,省略name参数改成无参版本,完全不会影响寄存器的核心功能。
当前的make-register实现里,name只是一个形式参数:既没有被用来初始化内部的contents状态,也没有在dispatch的消息处理逻辑中被引用。不管传不传这个参数,返回的dispatch闭包行为完全一致,寄存器的get、set功能都能正常工作。
不过要注意,这只是基于现有代码的结论。如果后续对make-register进行扩展(比如添加调试日志、状态打印功能,需要用名称来区分不同寄存器),那name参数就会发挥作用。但就题目里给出的现有实现而言,去掉name改成无参调用,运行起来没有任何区别。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

