more open coding

This commit is contained in:
Danny Yoo 2011-03-26 20:12:16 -04:00
parent e0b6367935
commit e862a43ae5
5 changed files with 70 additions and 11 deletions

View File

@ -417,28 +417,50 @@ EOF
(define (open-code-kernel-primitive-procedure op) (define (open-code-kernel-primitive-procedure op)
(let: ([operator : KernelPrimitiveName (CallKernelPrimitiveProcedure-operator op)] (let: ([operator : KernelPrimitiveName (CallKernelPrimitiveProcedure-operator op)]
[rand-vals : (Listof String) (map assemble-input (CallKernelPrimitiveProcedure-operands op))]) [rand-vals : (Listof String) (map assemble-input (CallKernelPrimitiveProcedure-operands op))])
(cond (case operator
[(eq? operator '+) [(+)
(cond [(empty? rand-vals) (cond [(empty? rand-vals)
"0"] "0"]
[else [else
(string-append "(" (string-join rand-vals " + ") ")")])] (string-append "(" (string-join rand-vals " + ") ")")])]
[(eq? operator 'add1) [(add1)
(unless (= 1 (length rand-vals)) (unless (= 1 (length rand-vals))
(error 'add1 "Expected one argument")) (error 'add1 "Expected one argument"))
(format "(~a + 1)" (first rand-vals))] (format "(~a + 1)" (first rand-vals))]
[(eq? operator 'sub1) [(sub1)
(unless (= 1 (length rand-vals)) (unless (= 1 (length rand-vals))
(error 'sub1 "Expected one argument")) (error 'sub1 "Expected one argument"))
(format "(~a - 1)" (first rand-vals))] (format "(~a - 1)" (first rand-vals))]
[(eq? operator '<) [(<)
(unless (> (length rand-vals) 0) (unless (> (length rand-vals) 0)
(error '< "Expected at least one argument")) (error '< "Expected at least one argument"))
(assemble-chain "<" rand-vals)] (assemble-chain "<" rand-vals)]
[(eq? operator '<=) [(<=)
(unless (> (length rand-vals) 0) (unless (> (length rand-vals) 0)
(error '<= "Expected at least one argument")) (error '<= "Expected at least one argument"))
(assemble-chain "<=" rand-vals)]))) (assemble-chain "<=" rand-vals)]
[(=)
(unless (> (length rand-vals) 0)
(error '= "Expected at least one argument"))
(assemble-chain "==" rand-vals)]
[(cons)
(unless (= (length rand-vals) 2)
(error 'cons "Expected two arguments"))
(format "[~a, ~a]" (first rand-vals) (second rand-vals))]
[(car)
(unless (= (length rand-vals) 1)
(error 'car "Expected one argument"))
(format "(~a)[0]" (first rand-vals))]
[(cdr)
(unless (= (length rand-vals) 1)
(error 'cdr "Expected one argument"))
(format "(~a)[1]" (first rand-vals))]
[(null?)
(unless (= (length rand-vals) 1)
(error 'null? "Expected one argument"))
(format "(~a === Primitives.null)"
(first rand-vals))])))
(: assemble-chain (String (Listof String) -> String)) (: assemble-chain (String (Listof String) -> String))
(define (assemble-chain rator rands) (define (assemble-chain rator rands)

View File

@ -153,7 +153,14 @@
'add1 'add1
'sub1 'sub1
'< '<
'<=)) '<=
'=
'cons
'car
'cdr
'null?
))
(define-predicate KernelPrimitiveName? KernelPrimitiveName) (define-predicate KernelPrimitiveName? KernelPrimitiveName)

View File

@ -3,6 +3,7 @@
(require "simulator-structs.rkt") (require "simulator-structs.rkt")
(provide ensure-primitive-value-box (provide ensure-primitive-value-box
ensure-primitive-value ensure-primitive-value
ensure-list
PrimitiveValue->racket PrimitiveValue->racket
racket->PrimitiveValue) racket->PrimitiveValue)
(define (ensure-primitive-value-box x) (define (ensure-primitive-value-box x)
@ -43,6 +44,17 @@
(error 'ensure-primitive-value "~s" v)]))) (error 'ensure-primitive-value "~s" v)])))
(define (ensure-list v)
(cond
[(null? v)
v]
[(and (MutablePair? v)
(PrimitiveValue? (MutablePair-h v))
(PrimitiveValue? (MutablePair-t v)))
v]
[else
(error 'ensure-list)]))
(define (PrimitiveValue->racket v) (define (PrimitiveValue->racket v)
(cond (cond

View File

@ -20,6 +20,7 @@
(require/typed "simulator-helpers.rkt" (require/typed "simulator-helpers.rkt"
[ensure-primitive-value-box (SlotValue -> (Boxof PrimitiveValue))] [ensure-primitive-value-box (SlotValue -> (Boxof PrimitiveValue))]
[ensure-primitive-value (SlotValue -> PrimitiveValue)] [ensure-primitive-value (SlotValue -> PrimitiveValue)]
[ensure-list (Any -> PrimitiveValue)]
[racket->PrimitiveValue (Any -> PrimitiveValue)]) [racket->PrimitiveValue (Any -> PrimitiveValue)])
@ -336,9 +337,9 @@
(: evaluate-kernel-primitive-procedure-call (machine CallKernelPrimitiveProcedure -> PrimitiveValue)) (: evaluate-kernel-primitive-procedure-call (machine CallKernelPrimitiveProcedure -> PrimitiveValue))
(define (evaluate-kernel-primitive-procedure-call m op) (define (evaluate-kernel-primitive-procedure-call m op)
(let: ([op : KernelPrimitiveName (CallKernelPrimitiveProcedure-operator op)] (let: ([op : KernelPrimitiveName (CallKernelPrimitiveProcedure-operator op)]
[rand-vals : (Listof SlotValue) [rand-vals : (Listof PrimitiveValue)
(map (lambda: ([a : OpArg]) (map (lambda: ([a : OpArg])
(evaluate-oparg m a)) (ensure-primitive-value (evaluate-oparg m a)))
(CallKernelPrimitiveProcedure-operands op))]) (CallKernelPrimitiveProcedure-operands op))])
(case op (case op
[(+) [(+)
@ -351,6 +352,16 @@
(chain-compare < (map ensure-real-number rand-vals))] (chain-compare < (map ensure-real-number rand-vals))]
[(<=) [(<=)
(chain-compare <= (map ensure-real-number rand-vals))] (chain-compare <= (map ensure-real-number rand-vals))]
[(=)
(chain-compare = (map ensure-real-number rand-vals))]
[(cons)
(make-MutablePair (first rand-vals) (ensure-list (second rand-vals)))]
[(car)
(MutablePair-h (ensure-mutable-pair (first rand-vals)))]
[(cdr)
(MutablePair-t (ensure-mutable-pair (first rand-vals)))]
[(null?)
(null? (first rand-vals))]
[else [else
(error 'evaluate-kernel-primitive-procedure-call "missing operator: ~s\n" op)]))) (error 'evaluate-kernel-primitive-procedure-call "missing operator: ~s\n" op)])))
@ -474,6 +485,13 @@
(error 'ensure-number "Not a number: ~s" x))) (error 'ensure-number "Not a number: ~s" x)))
(: ensure-mutable-pair (Any -> MutablePair))
(define (ensure-mutable-pair x)
(if (MutablePair? x)
x
(error 'ensure-mutable-pair "not a mutable pair: ~s" x)))
(: ensure-CapturedControl (Any -> CapturedControl)) (: ensure-CapturedControl (Any -> CapturedControl))
(define (ensure-CapturedControl x) (define (ensure-CapturedControl x)

View File

@ -67,4 +67,4 @@
(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"))
#:debug? #f) #:debug? #t)