diff --git a/assemble.rkt b/assemble.rkt index 86cb1d5..0ea5aa8 100644 --- a/assemble.rkt +++ b/assemble.rkt @@ -192,12 +192,16 @@ (let: loop : String ([val : Any (Const-const stmt)]) (cond [(symbol? val) (format "~s" (symbol->string val))] - [(list? val) - (format "_list(~a)" (string-join (map loop val) - ","))] + [(pair? val) + (format "[~a, ~a]" + (loop (car val)) + (loop (cdr val)))] + [(empty? val) + (format "undefined")] [else (format "~s" val)]))) + (: assemble-op-expression ((U PrimitiveOperator TestOperator) (Listof OpArg) -> String)) (define (assemble-op-expression op-name inputs) (let ([assembled-inputs (map assemble-input inputs)]) @@ -250,13 +254,10 @@ (first assembled-inputs))] [(extend-environment/prefix) (format "new ExtendedPrefixEnvironment(~a, ~a)" - (second assembled-inputs) - (first assembled-inputs))] - #;[(lookup-variable-value) - (format "((~a).globalBindings[~a])" (second assembled-inputs) (first assembled-inputs))]))) + (: assemble-op-statement (PerformOperator (Listof OpArg) -> String)) (define (assemble-op-statement op-name inputs) (let ([assembled-inputs (map assemble-input inputs)]) diff --git a/compile.rkt b/compile.rkt index c6e03a6..fa36976 100644 --- a/compile.rkt +++ b/compile.rkt @@ -80,7 +80,7 @@ (make-instruction-sequence '() (list target) - `(,(make-AssignImmediateStatement target (make-Const exp)))))) + `(,(make-AssignImmediateStatement target (make-Const (Constant-v exp))))))) (: compile-quoted (Quote CompileTimeEnvironment Target Linkage -> InstructionSequence)) (define (compile-quoted exp cenv target linkage) diff --git a/runtime.js b/runtime.js index 68e23bd..9a44291 100644 --- a/runtime.js +++ b/runtime.js @@ -7,44 +7,59 @@ // function closures are Closures // primitive procedures are regular functions. -var TopEnvironment = function() { - this.globalBindings = { - '=': function(argl) { - return argl[0] === argl[1][0]; - }, +var Primitives = { + '=': function(argl) { + return argl[0] === argl[1][0]; + }, + + '+': function(argl) { + return argl[0] + argl[1][0]; + }, + + '*': function(argl) { + return argl[0] * argl[1][0]; + }, + + '-': function(argl) { + return argl[0] - argl[1][0]; + }, + + '/': function(argl) { + return argl[0] / argl[1][0]; + } +}; - '+': function(argl) { - return argl[0] + argl[1][0]; - }, - '*': function(argl) { - return argl[0] * argl[1][0]; - }, - - '-': function(argl) { - return argl[0] - argl[1][0]; - }, - - '/': function(argl) { - return argl[0] / argl[1][0]; - } - }; +var TopEnvironment = function() { this.valss = []; }; + var ExtendedPrefixEnvironment = function(parent, vs) { var vals = []; + this.names = []; while(vs) { - if (parent.globalBindings[vs[0]]) { - vals.push(parent.globalBindings[vs[0]]); + this.names.push(vs[0]); + if (Primitives[vs[0]]) { + vals.push(Primitives[vs[0]]); } else { vals.push(undefined); } vs = vs[1]; } + this.valss = parent.valss.slice(); this.valss.unshift(vals); - this.globalBindings = parent.globalBindings; +}; + +ExtendedPrefixEnvironment.prototype.lookup = function(name) { + var i; + for (i = 0; i < this.names.length; i++) { + if (this.names[i] === name) { + return this.valss[0][i]; + } + } + return undefined; }; var ExtendedEnvironment = function(parent, vs) { @@ -55,7 +70,6 @@ var ExtendedEnvironment = function(parent, vs) { } this.valss = parent.valss.slice(); this.valss.unshift(vals); - this.globalBindings = parent.globalBindings; }; diff --git a/typed-structs.rkt b/typed-structs.rkt index 339c973..1766012 100644 --- a/typed-structs.rkt +++ b/typed-structs.rkt @@ -63,9 +63,12 @@ (define-struct: SaveStatement ([reg : Symbol]) #:transparent) (define-struct: RestoreStatement ([reg : Symbol]) #:transparent) -(define-struct: Label ([name : Symbol])) -(define-struct: Reg ([name : Symbol])) -(define-struct: Const ([const : Any])) +(define-struct: Label ([name : Symbol]) + #:transparent) +(define-struct: Reg ([name : Symbol]) + #:transparent) +(define-struct: Const ([const : Any]) + #:transparent) (define-type OpArg (U Const Label Reg)) @@ -144,7 +147,8 @@ ;; Lexical environments ;; A toplevel prefix contains a list of toplevel variables. -(define-struct: Prefix ([names : (Listof Symbol)])) +(define-struct: Prefix ([names : (Listof Symbol)]) + #:transparent) ;; A compile-time environment is a (listof (listof symbol)). ;; A lexical address is either a 2-tuple (depth pos), or 'not-found. @@ -153,7 +157,9 @@ (define-type LexicalAddress (U LocalAddress PrefixAddress)) (define-struct: LocalAddress ([depth : Natural] - [pos : Natural])) + [pos : Natural]) + #:transparent) (define-struct: PrefixAddress ([depth : Natural] [pos : Natural] - [name : Symbol])) \ No newline at end of file + [name : Symbol]) + #:transparent) \ No newline at end of file