diff --git a/simulator.rkt b/simulator.rkt index 7058e2e..6e9ef19 100644 --- a/simulator.rkt +++ b/simulator.rkt @@ -139,7 +139,12 @@ (let: ([op : PrimitiveCommand (PerformStatement-op stmt)]) (cond [(SetToplevel!? op) - (error 'step-perform)] + (env-mutate m + (SetToplevel!-depth op) + (toplevel-mutate (ensure-toplevel (env-ref m (SetToplevel!-depth op))) + (SetToplevel!-pos op) + + (machine-val m)))] [(CheckToplevelBound!? op) (error 'step-perform)] [(ExtendEnvironment/Prefix!? op) @@ -182,7 +187,15 @@ [else (error 'ensure-symbol)])) - + +(: ensure-toplevel (Any -> toplevel)) +(define (ensure-toplevel v) + (cond + [(toplevel? v) + v] + [else + (error 'ensure-toplevel)])) + (: current-instruction (machine -> Statement)) (define (current-instruction m) @@ -280,3 +293,9 @@ (loop (add1 i))]))) +(: toplevel-mutate (toplevel Natural Any -> toplevel)) +(define (toplevel-mutate a-top index v) + (make-toplevel (append (take (toplevel-vals a-top) index) + (list v) + (drop (toplevel-vals a-top) (add1 index))))) + \ No newline at end of file diff --git a/test-simulator.rkt b/test-simulator.rkt index 8f1bbef..c3a121f 100644 --- a/test-simulator.rkt +++ b/test-simulator.rkt @@ -230,16 +230,25 @@ (lookup-primitive '-) (lookup-primitive '*) (lookup-primitive '=))))) - - (let ([m (new-machine `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(some-variable))) ,(make-AssignImmediateStatement 'val (make-Const "Danny")) ,(make-PerformStatement (make-SetToplevel! 0 0 'some-variable))))]) (run m) ;; FIXME: I'm hitting what appears to be a Typed Racket bug that prevents me from inspecting ;; the toplevel structure in the environment... :( - #;(test (first (machine-env (run m))) - (make-toplevel (vector (lookup-primitive '+) - (lookup-primitive '-) - (lookup-primitive '*) - (lookup-primitive '=))))) \ No newline at end of file + ) +(let ([m (new-machine `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(some-variable another))) + ,(make-AssignImmediateStatement 'val (make-Const "Danny")) + ,(make-PerformStatement (make-SetToplevel! 0 1 'another))))]) + (run m) + ;; FIXME: I'm hitting what appears to be a Typed Racket bug that prevents me from inspecting + ;; the toplevel structure in the environment... :( + ) +(let ([m (new-machine `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(some-variable))) + ,(make-AssignImmediateStatement 'val (make-Const "Danny")) + ,(make-PushEnvironment 5) + ,(make-PerformStatement (make-SetToplevel! 5 0 'some-variable))))]) + (run m) + ;; FIXME: I'm hitting what appears to be a Typed Racket bug that prevents me from inspecting + ;; the toplevel structure in the environment... :( + )