diff --git a/simulator-structs.rkt b/simulator-structs.rkt index e182bd1..a0d5fa7 100644 --- a/simulator-structs.rkt +++ b/simulator-structs.rkt @@ -16,14 +16,20 @@ #:transparent) -(define-struct: frame ([return : Symbol]) +(define-struct: frame ([return : Symbol] + ;; TODO: add continuation marks + ) #:transparent) (define-struct: toplevel ([vals : (Vectorof Any)]) #:transparent) + ;; Primitive procedure wrapper -(define-struct: primitive-proc ([f : (Any * -> Any)])) - - +(define-struct: primitive-proc ([f : (Any * -> Any)]) + #:transparent) +;; Compiled procedure closures +(define-struct: closure ([label : Symbol] + [vals : (Listof Any)]) + #:transparent) diff --git a/simulator.rkt b/simulator.rkt index 51a9f92..aa8a35b 100644 --- a/simulator.rkt +++ b/simulator.rkt @@ -12,7 +12,7 @@ (for-syntax racket/base)) (require/typed "simulator-prims.rkt" - [lookup-primitive (Symbol -> (Any * -> Any))]) + [lookup-primitive (Symbol -> Any)]) (provide new-machine can-step? step) @@ -43,7 +43,7 @@ [(AssignPrimOpStatement? i) (error 'step)] [(PerformStatement? i) - (error 'step)] + (step-perform m i)] [(GotoStatement? i) (step-goto m i)] [(TestAndBranchStatement? i) @@ -132,6 +132,24 @@ (machine-val m)] [(eq? reg 'proc) (machine-proc m)])) + + +(: step-perform (machine PerformStatement -> machine)) +(define (step-perform m stmt) + (let: ([op : PrimitiveCommand (PerformStatement-op stmt)]) + (cond + [(SetToplevel!? op) + (error 'step-perform)] + [(CheckToplevelBound!? op) + (error 'step-perform)] + [(ExtendEnvironment/Prefix!? op) + (env-push m + (make-toplevel (list->vector + (map lookup-primitive + (ExtendEnvironment/Prefix!-names op)))))] + [(InstallClosureValues!? op) + (error 'step-perform)]))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/test-simulator.rkt b/test-simulator.rkt index b019b26..d0bb6f7 100644 --- a/test-simulator.rkt +++ b/test-simulator.rkt @@ -11,12 +11,7 @@ [(_ actual exp) (with-syntax ([stx stx]) (syntax/loc #'stx - (let ([results (with-handlers ([exn:fail? - (lambda (exn) - (raise-syntax-error #f (format "Exception happened: ~s" - (exn-message exn)) - #'stx))]) - actual)]) + (let ([results actual]) (unless (equal? actual exp) (raise-syntax-error #f (format "Expected ~s, got ~s" exp results) #'stx)))))])) @@ -227,8 +222,8 @@ ;; AssignPrimOpStatement (let ([m (new-machine `(,(make-PerformStatement (make-ExtendEnvironment/Prefix! '(+ - * =)))))]) - (test (machine-env (run m)) - (list (make-toplevel (vector (lookup-primitive +) - (lookup-primitive -) - (lookup-primitive *) - (lookup-primitive =)))))) \ No newline at end of file + (test (first (machine-env (run m))) + (make-toplevel (vector (lookup-primitive '+) + (lookup-primitive '-) + (lookup-primitive '*) + (lookup-primitive '=))))) \ No newline at end of file