#lang play (require "env.rkt") ;; Parte 1 #| ::= {* } ::= {define { *} } ::= | | | {cons } | {add1 } | {+ } | {< } | {= } | {! } | {&& } | {|| } | {fst } | {snd } | {if } | {with {{ }*} } | { *} |# (deftype Prog (prog fundefs main)) (deftype Fundef (fundef name arg body)) (deftype Expr (num n) (id x) (bool b) (add l r) (lt l r) ; ... ) ;; tipo inductivo para los valores del lenguaje (deftype Val (numV n) (boolV b) (pairV lV rV)) ;; parse :: ... (define (parse sp) (match sp [(list ds ... e) (prog (map parse-fundef ds) (parse-expr e))] ;; ds es la lista de definiciones, e es la expresion principal )) ;; parse-expr :: ... (define (parse-expr se) (match se [(? number?) (num se)] [(? symbol?) (id se)] [(? boolean?) (bool se)] [(list '+ e1 e2) (add (parse-expr e1) (parse-expr e2))] [(list '< e1 e2) (lt (parse-expr e1) (parse-expr e2))] ; ... [_ (error "not yet implemented")] )) ;; parse-fundef :: ... (define (parse-fundef sf) ; ... (error "not yet implemented")) ;; interp :: ... (define (interp e env funs) (match e [(num n) (numV n)] [(id x) (env-lookup x env)] [(bool b) (boolV b)] ; ... [_ (error "not yet implemented")] )) (define (run sp) (def (prog funs main) (parse sp)) (interp main empty-env funs))