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