From f3b2d11279edf12b28a266ecdde3f43b62cdd1f5 Mon Sep 17 00:00:00 2001 From: Yiyun Liu Date: Sun, 25 May 2025 22:16:02 -0400 Subject: [PATCH] Add semantics --- ast.rkt | 7 ++++++- semantics.rkt | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 semantics.rkt diff --git a/ast.rkt b/ast.rkt index 9a42334..4bb9039 100644 --- a/ast.rkt +++ b/ast.rkt @@ -29,4 +29,9 @@ (define-type CoreBinds (Binds Name)) (define-type CoreAlts (Alts Name)) -(provide CoreExpr CoreScDefn CoreProgram CoreBind CoreAlt Expr Bind Alt Name Let Arity ConId CoreAlts CoreBinds) +(: scdefn-name (All (A) (-> (ScDefn A) Name) )) +(define (scdefn-name a) + (match a + [(list 'define (cons n _) _) n])) + +(provide CoreExpr CoreScDefn CoreProgram CoreBind CoreAlt Expr Bind Alt Name Let Arity ConId CoreAlts CoreBinds scdefn-name) diff --git a/semantics.rkt b/semantics.rkt new file mode 100644 index 0000000..22a3add --- /dev/null +++ b/semantics.rkt @@ -0,0 +1,43 @@ +#lang typed/racket +(require "ast.rkt") + +(struct State ([stack : Stack] [dump : Dump] [heap : Heap] [globals : Globals] [stats : Stats])) +(define-type Addr Symbol) +(define-type Stack (Listof Addr)) +(define-type Dump Null) +(define-type Heap (Immutable-HashTable Addr Node)) +(define-type Node (∪ (List Addr Addr) CoreScDefn Integer)) +(define-type Globals (Immutable-HashTable Name Addr)) +(define-type Stats Nonnegative-Integer) + +(: new-addr (-> Addr)) +(define (new-addr) + (gensym)) + +(: initial-dump Dump) +(define initial-dump '()) + +(: initial-stats Stats) +(define initial-stats 0) + +(: incr-stats (-> Stats Stats)) +(define incr-stats add1) + +(: update-stats (-> (-> Stats Stats) State State)) +(define (update-stats f mstate) + (struct-copy State mstate [stats (f (State-stats mstate))])) + +(: allocate-node (-> Heap Node (Values Heap Addr))) +(define (allocate-node heap node) + (let ([addr (new-addr)]) + (values (hash-set heap addr node) addr))) + +(: allocate-sc (-> Heap CoreScDefn (Values Heap (Pair Name Addr)))) +(define (allocate-sc heap scdef) + (let-values ([(heap addr) (allocate-node heap scdef)]) + (values heap (cons (scdefn-name scdef) addr)))) + + +;; (: initial-heap (-> (Listof CoreScDefn) (Values Heap Globals))) +;; (define (initial-heap scs) +;; (for/fold ([heap ])))