From 647ea457332b4e5e7fb3d42b0fc9e5aa94c1fe7c Mon Sep 17 00:00:00 2001 From: Isaac Shoebottom Date: Thu, 10 Apr 2025 04:13:12 -0300 Subject: [PATCH] wip --- Assignments/04.rkt | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Assignments/04.rkt b/Assignments/04.rkt index 00d915b..22507f8 100644 --- a/Assignments/04.rkt +++ b/Assignments/04.rkt @@ -127,8 +127,23 @@ (if (equal? var-t val-t) body-t (error 'typecheck "type does not match annotation")))] - [(objE fields) ....] - [(msgE obj selector) ....] ))) + [(objE fields) (let* ([extract-exp (lambda (obj) (pair (fst obj) (typecheck (snd obj) env)))] + [field-list (map extract-exp fields)]) + (objT (make-hash field-list)))] + [(msgE obj selector) (type-case Exp obj + [(objE fields) (type-case (Optionof Exp) (hash-ref (make-hash fields) selector) + [(none) (error 'typecheck "unknown field")] + [(some v) (typecheck v env)])] + [(varE name) (type-case Type (type-lookup name env) + [(objT fields) (type-case (Optionof Type) (hash-ref fields selector) + [(none) (error 'typecheck "dasdas")] + [(some v) (type-case Type v + [(arrowT a b) b] + [else (error 'dasdas "dasdas")])])] + [else (error 'typecheck "bound variable is not an object")])] + + [else (error 'typecheck "passing message to non-object")])] + ))) (define (parse-error sx) (error 'parse (string-append "parse error: " (to-string sx))))