(define number-tag #b000)
(define immed-tag #b001)
(define pair-tag #b010)
(define string-tag #b011)
(define symbol-tag #b100)
(define vector-tag #b101)
(define closure-tag #b110)
(define mask #b111)
(define tag-len 3)
(define bool-tag #b00000001)
(define null-tag #b00001001)
(define char-tag #b00010001)
(define imm-mask #b11111111)
(define imm-tag-len 8)
(define ws 4)
(define encode
(let ([numtop (expt 2 29)])
(lambda (obj)
(cond
[(number? obj)
(cond
[(and (<= 0 obj) (< obj numtop))
(* obj (+ mask 1))]
[(and (<= (- numtop) obj) (< obj 0))
(* (+ numtop obj) (+ mask 1))]
[else
(error 'encode "~s is out of range" obj)])]
[(boolean? obj)
(+ (* (if obj 1 0) (+ imm-mask 1)) bool-tag)]
[(null? obj) null-tag]
[(char? obj)
(let ([val (char->integer obj)])
(+ (* val (+ imm-mask 1)) char-tag))]
[else
(error 'encode "~s not encodable" obj)]))))
(define instructions
(lambda args
(cons 'instructions
(let loop ([ls args])
(if (null? ls)
'()
(if (eq? (caar ls) 'instructions)
(append (cdar ls)
(loop (cdr ls)))
(cons (car ls)
(loop (cdr ls)))))))))