Update to treelist for the heap

This commit is contained in:
Yiyun Liu 2025-06-05 22:24:43 -04:00
parent 784d27d564
commit 716c16a4c4

View file

@ -1,31 +1,27 @@
#lang typed/racket #lang typed/racket
(require "ast.rkt") (require "ast.rkt")
(require racket/treelist)
(: prelude CoreProgram) (: prelude CoreProgram)
(define prelude (define prelude
'((define (I x) x) (define (K x y) x) (define (K1 x y) y) (define (S f g x) ((f x) (g x))) (define (compose f g x) (f (g x))) (define (twice f) ((compose f) f)))) '((define (I x) x) (define (K x y) x) (define (K1 x y) y) (define (S f g x) ((f x) (g x))) (define (compose f g x) (f (g x))) (define (twice f) ((compose f) f))))
(struct State ([stack : Stack] [dump : Dump] [heap : Heap] [globals : Globals] [stats : Stats])) (struct State ([stack : Stack] [dump : Dump] [heap : Heap] [globals : Globals] [stats : Stats]))
(define-type Addr Symbol) (define-type Addr Index)
(define-type Stack (Listof Addr)) (define-type Stack (Listof Addr))
(define-type Dump Null) (define-type Dump Null)
(define-type Heap (Immutable-HashTable Addr Node)) (define-type Heap (TreeListof Node))
(define-type Node ( (List Addr Addr) CoreScDefn Integer)) (define-type Node ( (List Addr Addr) CoreScDefn Integer))
(define-type Globals (Immutable-HashTable Name Addr)) (define-type Globals (Immutable-HashTable Name Addr))
(define-type Stats Nonnegative-Integer) (define-type Stats Nonnegative-Integer)
(: empty-heap Heap) (: empty-heap Heap)
(define empty-heap (define empty-heap
(make-immutable-hash)) (treelist))
(: empty-globals Globals) (: empty-globals Globals)
(define empty-globals (define empty-globals
(make-immutable-hash)) (make-immutable-hash))
(: new-addr (-> Addr))
(define (new-addr)
(gensym))
(: empty-dump Dump) (: empty-dump Dump)
(define empty-dump '()) (define empty-dump '())
@ -52,11 +48,11 @@
(: allocate-node (-> Heap Node (Values Heap Addr))) (: allocate-node (-> Heap Node (Values Heap Addr)))
(define (allocate-node heap node) (define (allocate-node heap node)
(let ([addr (new-addr)]) (let ([heap (treelist-add heap node)])
(values (hash-set heap addr node) addr))) (values heap (treelist-length heap))))
(: lookup-node (-> Heap Addr Node)) (: lookup-node (-> Heap Addr Node))
(define lookup-node hash-ref) (define lookup-node treelist-ref)
(: lookup-globals (-> Globals Name Addr)) (: lookup-globals (-> Globals Name Addr))
(define lookup-globals hash-ref) (define lookup-globals hash-ref)