still trying to figure out why the lexical scoping is breaking up

This commit is contained in:
Danny Yoo 2011-03-14 17:04:48 -04:00
parent d2cc4852ed
commit 1e83a6f8e5
6 changed files with 117 additions and 65 deletions

View File

@ -1,9 +1,97 @@
#lang racket/base #lang racket/base
(require "simulator-structs.rkt") (require "simulator-structs.rkt")
(provide ensure-primitive-value-box) (provide ensure-primitive-value-box
ensure-primitive-value
PrimitiveValue->racket
racket->PrimitiveValue)
(define (ensure-primitive-value-box x) (define (ensure-primitive-value-box x)
(if (and (box? x) (if (and (box? x)
(PrimitiveValue? (unbox x))) (PrimitiveValue? (unbox x)))
x x
(error 'ensure-primitive-value-box "~s" x))) (error 'ensure-primitive-value-box "~s" x)))
;; Make sure the value is primitive.
(define (ensure-primitive-value val)
(let loop ([v val])
(cond
[(string? v)
v]
[(symbol? v)
v]
[(number? v)
v]
[(boolean? v)
v]
[(null? v)
v]
[(void? v)
v]
[(MutablePair? v)
v]
[(primitive-proc? v)
v]
[(closure? v)
v]
[(undefined? v)
v]
[(vector? v)
v]
[else
(error 'ensure-primitive-value "~s" v)])))
(define (PrimitiveValue->racket v)
(cond
[(string? v)
v]
[(number? v)
v]
[(symbol? v)
v]
[(boolean? v)
v]
[(null? v)
v]
[(void? v)
v]
[(undefined? v)
(letrec ([x x]) x)]
[(primitive-proc? v)
v]
[(closure? v)
v]
[(vector? v)
(apply vector (map PrimitiveValue->racket (vector->list v)))]
[(MutablePair? v)
(cons (PrimitiveValue->racket (MutablePair-h v))
(PrimitiveValue->racket (MutablePair-t v)))]))
(define (racket->PrimitiveValue v)
(cond
[(string? v)
v]
[(number? v)
v]
[(symbol? v)
v]
[(boolean? v)
v]
[(null? v)
v]
[(void? v)
v]
[(eq? v (letrec ([x x]) x))
(make-undefined)]
[(procedure? v)
(error 'racket->PrimitiveValue "Can't coerse procedure")]
[(vector? v)
(apply vector (map racket->PrimitiveValue (vector->list v)))]
[(pair? v)
(make-MutablePair (racket->PrimitiveValue (car v))
(racket->PrimitiveValue (cdr v)))]))

View File

@ -4,8 +4,7 @@
racket/math racket/math
(for-syntax racket/base)) (for-syntax racket/base))
(provide lookup-primitive (provide lookup-primitive)
PrimitiveValue->racket)
(define-syntax (make-lookup stx) (define-syntax (make-lookup stx)
@ -82,7 +81,7 @@
display display
displayln displayln
newline newline
symbol->string
(my-cons cons) (my-cons cons)
(my-list list) (my-list list)
@ -96,29 +95,3 @@
call-with-current-continuation))) call-with-current-continuation)))
(define (PrimitiveValue->racket v)
(cond
[(string? v)
v]
[(number? v)
v]
[(symbol? v)
v]
[(boolean? v)
v]
[(null? v)
v]
[(void? v)
v]
[(undefined? v)
(letrec ([x x]) x)]
[(primitive-proc? v)
v]
[(closure? v)
v]
[(vector? v)
(apply vector (map PrimitiveValue->racket (vector->list v)))]
[(MutablePair? v)
(cons (PrimitiveValue->racket (MutablePair-h v))
(PrimitiveValue->racket (MutablePair-t v)))]))

View File

@ -15,8 +15,10 @@
[lookup-primitive (Symbol -> PrimitiveValue)]) [lookup-primitive (Symbol -> PrimitiveValue)])
(require/typed "simulator-helpers.rkt" (require/typed "simulator-helpers.rkt"
[ensure-primitive-value-box (Any -> (Boxof PrimitiveValue))]) [ensure-primitive-value-box (SlotValue -> (Boxof PrimitiveValue))]
[ensure-primitive-value (SlotValue -> PrimitiveValue)]
[racket->PrimitiveValue (Any -> PrimitiveValue)])
(provide new-machine can-step? step! current-instruction (provide new-machine can-step? step! current-instruction
current-simulated-output-port current-simulated-output-port
@ -296,7 +298,7 @@
(define (evaluate-oparg m an-oparg) (define (evaluate-oparg m an-oparg)
(cond (cond
[(Const? an-oparg) [(Const? an-oparg)
(ensure-primitive-value (Const-const an-oparg))] (racket->PrimitiveValue (Const-const an-oparg))]
[(Label? an-oparg) [(Label? an-oparg)
(Label-name an-oparg)] (Label-name an-oparg)]
@ -351,35 +353,6 @@
(error 'ensure-closure))) (error 'ensure-closure)))
(: ensure-primitive-value (Any -> PrimitiveValue))
;; Make sure the value is primitive.
(define (ensure-primitive-value val)
(let: loop : PrimitiveValue ([v : Any val])
(cond
[(string? v)
v]
[(symbol? v)
v]
[(number? v)
v]
[(boolean? v)
v]
[(null? v)
v]
[(void? v)
v]
[(cons? v)
(make-MutablePair (loop (car v)) (loop (cdr v)))]
[(MutablePair? v)
v]
[(primitive-proc? v)
v]
[(closure? v)
v]
[(undefined? v)
v]
[else
(error 'ensure-primitive-value "Unable to coerse Const ~s to a primitive value" v)])))
(: ensure-symbol (Any -> Symbol)) (: ensure-symbol (Any -> Symbol))
;; Make sure the value is a symbol. ;; Make sure the value is a symbol.

View File

@ -2,7 +2,7 @@
(require "simulator.rkt" (require "simulator.rkt"
"simulator-structs.rkt" "simulator-structs.rkt"
"simulator-primitives.rkt" "simulator-helpers.rkt"
"compile.rkt" "compile.rkt"
"parse.rkt") "parse.rkt")

View File

@ -19,7 +19,8 @@
(let loop ([steps 0]) (let loop ([steps 0])
(when debug? (when debug?
(when (can-step? m) (when (can-step? m)
(printf "|env|=~s, |control|=~s, instruction=~s\n" (printf "pc=~s, |env|=~s, |control|=~s, instruction=~s\n"
(machine-pc m)
(length (machine-env m)) (length (machine-env m))
(length (machine-control m)) (length (machine-control m))
(current-instruction m)))) (current-instruction m))))
@ -61,6 +62,7 @@
#'stx)) #'stx))
(printf "ok. ~s steps.\n\n" num-steps)))))])) (printf "ok. ~s steps.\n\n" num-steps)))))]))
(current-simulated-output-port (current-output-port))
(test (read (open-input-file "tests/conform/program0.sch")) (test (read (open-input-file "tests/conform/program0.sch"))
(port->string (open-input-file "tests/conform/expected0.txt")) (port->string (open-input-file "tests/conform/expected0.txt"))

View File

@ -87,6 +87,10 @@
(define set-internal-node-blue-edges! (lambda (node edges) (vector-set! node '3 edges))) (define set-internal-node-blue-edges! (lambda (node edges) (vector-set! node '3 edges)))
(define make-node (define make-node
(lambda (name blue-edges) (lambda (name blue-edges)
(displayln "name:")
(displayln name)
(displayln "blue-edges:")
(displayln blue-edges)
(let ((name (if (symbol? name) (symbol->string name) name)) (let ((name (if (symbol? name) (symbol->string name) name))
(blue-edges (if (null? blue-edges) 'NOT-A-NODE-YET (car blue-edges)))) (blue-edges (if (null? blue-edges) 'NOT-A-NODE-YET (car blue-edges))))
(make-internal-node name '() '() blue-edges)))) (make-internal-node name '() '() blue-edges))))
@ -211,7 +215,12 @@
(map (lambda (class) (fix (car class))) classes) (map (lambda (class) (fix (car class))) classes)
(fix-table (already-met graph)) (fix-table (already-met graph))
(fix-table (already-joined graph)))))) (fix-table (already-joined graph))))))
(displayln 'here)
(define none-node (make-node 'none '(#t))) (define none-node (make-node 'none '(#t)))
(displayln 'here5)
(define none-node? (lambda (node) (eq? node none-node))) (define none-node? (lambda (node) (eq? node none-node)))
(define any-node (make-node 'any ('()))) (define any-node (make-node 'any ('())))
(define any-node? (lambda (node) (eq? node any-node))) (define any-node? (lambda (node) (eq? node any-node)))
@ -229,6 +238,7 @@
(if (none-node? from-node) (if (none-node? from-node)
(begin '#t) (begin '#t)
(if (memq to-node (red-edges from-node)) (begin '#t) (begin '#f)))))) (if (memq to-node (red-edges from-node)) (begin '#t) (begin '#f))))))
(displayln 'here4)
(define sig (define sig
(let ((none-comma-any (cons none-node any-node))) (let ((none-comma-any (cons none-node any-node)))
(lambda (op node) (lambda (op node)
@ -236,6 +246,7 @@
(if (not (null? the-edge)) (cons (arg-node the-edge) (res-node the-edge)) none-comma-any))))) (if (not (null? the-edge)) (cons (arg-node the-edge) (res-node the-edge)) none-comma-any)))))
(define arg (lambda (pair) (car pair))) (define arg (lambda (pair) (car pair)))
(define res (lambda (pair) (cdr pair))) (define res (lambda (pair) (cdr pair)))
(displayln 'here3)
(define conforms? (define conforms?
(lambda (t1 t2) (lambda (t1 t2)
(letrec ((nodes-with-red-edges-out '()) (letrec ((nodes-with-red-edges-out '())
@ -327,6 +338,11 @@
(define blue-edge-operate (define blue-edge-operate
(lambda (arg-fn res-fn graph op sig1 sig2) (lambda (arg-fn res-fn graph op sig1 sig2)
(make-blue-edge op (arg-fn graph (arg sig1) (arg sig2)) (res-fn graph (res sig1) (res sig2))))) (make-blue-edge op (arg-fn graph (arg sig1) (arg sig2)) (res-fn graph (res sig1) (res sig2)))))
(displayln 'here2)
(define meet (define meet
(lambda (graph node1 node2) (lambda (graph node1 node2)
(if (eq? node1 node2) (if (eq? node1 node2)
@ -462,4 +478,4 @@
(newline)))) (newline))))
(void ((letrec ((loop (lambda (n) (if (zero? n) 'done (begin (go) (loop (- n '1))))))) loop) '10))) #;(void ((letrec ((loop (lambda (n) (if (zero? n) 'done (begin (go) (loop (- n '1))))))) loop) '10)))