#lang plait (require (typed-in racket/base [char->integer : (Char -> Number)] [integer->char : (Number -> Char)] [number->string : (Number -> String)] [vector->list : ((Vectorof Number) -> (Listof Number))]) (typed-in racket/vector [vector-copy : ((Vectorof Number) Number Number -> (Vectorof Number))])) (define MEMORY (make-vector 100 -1)) (define next-addr 0) (define (reset) (set! next-addr 0)) (define (write-and-bump v) (let ([n next-addr]) (begin (vector-set! MEMORY n v) (set! next-addr (add1 next-addr)) n))) (define (store-num n) (write-and-bump n)) (define (read-num a) (vector-ref MEMORY a)) (define (store-str s) (let ([a0 (write-and-bump (string-length s))]) (begin (map write-and-bump (map char->integer (string->list s))) a0))) (define (read-str a) (let* ([len (vector-ref MEMORY a)] [start (+ a 1)] [end (+ start len)] [slice (vector-copy MEMORY start end)] [lst (vector->list slice)]) (list->string (map integer->char lst)))) (test (read-str (store-str "cookie monster")) "cookie monster")