#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")