<< Previous exercise (5.48) | Index | Next exercise (5.50) >>
Controller ========== (define rcep-controller '((assign env (op get-global-environment)) read (perform (op prompt-for-input) (const ";;; RCEP-RM input:")) (assign val (op read)) (assign val (op compile) (reg val)) (assemble-val) (assign continue (label after-execute)) (goto (reg val)) after-execute (perform (op announce-output) (const ";;; RCEP-RM value:")) (perform (op user-print) (reg val)) (goto (label read)))) Assemble-val is the same as in the previous exercise. Operations ========== (define operations (append eceval-operations (list (list 'read read) (list 'compile statements-with-return) (list 'prompt-for-input prompt-for-input) (list 'announce-output announce-output) (list 'user-print user-print)) Statements-with-return is the same as in the previous exercise. Running the Read-Compile-Execute-Print Loop =========================================== (start (make-machine operations rcep-controller)) Data-Path ========= ^ / \ ─────────────────── after-exc \ get-globl-env / / \ ───────┬─────── ────┬──── │ │ 1 x 6 x │ │ v v ─────────────────── ┌───────────┐ ┌───────────┐ \ read / │ env │ │ continue │ ───────┬─────── └─────┬─────┘ └─────┬─────┘ │ │ │ │ │ │ 3 x │ │ ┌─────────┐ │ ┌─────────┐ │ ┌──────────┘ v │ v │ v v v ─────────────────── ┌┴─────────┴┐ ─────────────────── \ compile / │ val │ \ execute / ─────────────┬─ └─────┬──┬──┘ ─┬───────────── │ ^ ^ │ │ ^ │ └─────x───┘ │ │ │ └───x─────┘ 4 │ │ │ 7 5 x │ │ │ │ └─────────────────────┐ │ │ │ ┌─────────┘ │ │ │ v v │ ─────────────────── ─────────────────── │ \ assemble / \ user-print / │ ───────┬─────── ───────┬─────── └────────────┘ 9 x ^ ^ / \ / \ /;;;\ /;;;\ /input\ /outpt\ ────┬──── ────┬──── │ │ v v ─────────────────── ─────────────────── \prompt-for-inpt/ \announce-output/ ───────┬─────── ───────┬─────── 2 x 8 x Controller Diagram ================== ┌─────────────────────────┐ 1 │ get-global-environment │ └────────────┬────────────┘ │ v ┌─────────────────────────┐ 2 │ prompt-for-input │<───┐ └────────────┬────────────┘ │ │ │ v │ ┌─────────────────────────┐ │ 3 │ read │ │ └────────────┬────────────┘ │ │ │ v │ ┌─────────────────────────┐ │ 4 │ compile │ │ └────────────┬────────────┘ │ │ │ v │ ┌─────────────────────────┐ │ 5 │ assemble │ │ └────────────┬────────────┘ │ │ │ v │ ┌─────────────────────────┐ │ 6 │ assign-continue │ │ └────────────┬────────────┘ │ │ │ v │ ┌─────────────────────────┐ │ 7 │ execute │ │ └────────────┬────────────┘ │ │ │ v │ ┌─────────────────────────┐ │ 8 │ announce-output │ │ └────────────┬────────────┘ │ │ │ v │ ┌─────────────────────────┐ │ 9 │ user-print │ │ └────────────┬────────────┘ │ │ │ └─────────────────┘ Demo ==== ;;; RCEP-RM input: (define (factorial n) (if (= n 1) 1 (* (factorial (- n 1)) n))) ;;; RCEP-RM value: ok ;;; RCEP-RM input: (factorial 5) ;;; RCEP-RM value: 120 ;;; RCEP-RM input:
ypeels