(datatype bool (:true) (:false)) (define (random) (%%cexp (-> int) "random()")) ;; hmmm... think about defining a *boxed* (rather than tagged) type that will ;; hold a pointer. [or maybe better... consider switching to untagged ints ;; and having something like a 'stack map' for the gc that knows the type ;; of everything on the stack] (define (malloc n) (%%cexp (int -> int) "(pxll_int)malloc(%0)" n)) (define (free n) (%%cexp (int -> undefined) "free((void*)%0); PXLL_UNDEFINED" n)) (define (write-int p n) (%%cexp (int int -> undefined) "(*(pxll_int *)(%0)) = %1" p n)) (define (read-int p) (%%cexp (int -> int) "(*(pxll_int *)(%0))" p)) (define (printn x) (%%cexp ('a -> undefined) "dump_object (%0, 0); fprintf (stdout, \"\\n\")" x)) (define (sizeof-int) (%%cexp (-> int) "sizeof(pxll_int)")) (let ((x 3) (y (malloc 16))) (set! x (random)) (printn y) (write-int y 3141) (printn (read-int y)) (free y) (printn (sizeof-int)) #t )