SICP — Scheme/JS Structure and Interpretation of Computer Programs — Comparison Edition
Original Python
(define (make-new-machine) (let ((pc (make-register 'pc)) (flag (make-register 'flag)) (stack (make-stack)) (the-instruction-sequence '())) (let ((the-ops (list (list 'initialize-stack (lambda () (stack 'initialize))))) (register-table (list (list 'pc pc) (list 'flag flag)))) (define (allocate-register name) (if (assoc name register-table) (error "Multiply defined register: " name) (set! register-table (cons (list name (make-register name)) register-table))) 'register-allocated) (define (lookup-register name) (let ((val (assoc name register-table))) (if val (cadr val) (error "Unknown register:" name)))) (define (execute) (let ((insts (get-contents pc))) (if (null? insts) 'done (begin ((instruction-execution-proc (car insts))) (execute))))) (define (dispatch message) (cond ((eq? message 'start) (set-contents! pc the-instruction-sequence) (execute)) ((eq? message 'install-instruction-sequence) (lambda (seq) (set! the-instruction-sequence seq))) ((eq? message 'allocate-register) allocate-register) ((eq? message 'get-register) lookup-register) ((eq? message 'install-operations) (lambda (ops) (set! the-ops (append the-ops ops)))) ((eq? message 'stack) stack) ((eq? message 'operations) the-ops) (else (error "Unknown request - - MACHINE" message)))) dispatch)))
def make_new_machine(): pc = make_register("pc") flag = make_register("flag") stack = make_stack() the_instruction_sequence = None the_ops = llist(llist("initialize_stack", lambda: stack("initialize"))) register_table = llist(llist("pc", pc), llist("flag", flag)) def allocate_register(name): nonlocal register_table if is_undefined(assoc(name, register_table)): register_table = pair(llist(name, make_register(name)), register_table) else: error("multiply defined register", name) return "register allocated" def lookup_register(name): val = assoc(name, register_table) return (error("unknown register", name) if is_undefined(val) else head(tail(val))) def execute(): insts = get_contents(pc) if is_null(insts): return "done" else: inst_execution_fun(head(insts))() return execute() def dispatch(message): def start(): set_contents(pc, the_instruction_sequence) return execute() def install_instruction_sequence(seq): nonlocal the_instruction_sequence the_instruction_sequence = seq def install_operations(ops): nonlocal the_ops the_ops = append(the_ops, ops) return (start() if message == "start" else install_instruction_sequence if message == "install_instruction_sequence" else allocate_register if message == "allocate_register" else lookup_register if message == "get_register" else install_operations if message == "install_operations" else stack if message == "stack" else the_ops if message == "operations" else error("unknown request -- machine", message)) return dispatch
Figure 5.16 The make_new_machine function implements the basic machine model.
5.2.1   The Machine Model