2 Tests and examples for envlang/rkt
2.1 Identity
«λ-using-app» ::=
(|\| #hash() env args (|\| (hash-set (hash-set (hash-set empty-hash "arg-name" (symbol->string (@ promise-e env (car (@ force env args))))) "body" (car (cdr (@ force env args)))) "saved-env" env) env args (@ (hash-ref closure "body") (hash-set (hash-ref closure "saved-env") (hash-ref closure "arg-name") (map (envlang->racket (|\| #hash() env args (@ force env (car args))) env) (@ force env args))) args)))
«λ» ::=
(|\| closure env args (|\| (@ hash-set env (delay (list (delay (@ hash-set env (delay (list (delay (@ hash-set env (delay (list (delay (@ hash-set env (delay (list (delay empty-hash) (delay "arg-name") (delay (@ symbol->string env (delay (list (delay (@ promise-e env (@ car env (delay (list (delay (@ force env args))))))))))))))) (delay "body") (delay (@ car env (delay (list (delay (@ cdr env (delay (list (delay (@ force env args)))))))))))))) (delay "saved-env") (delay env))))) (delay "saved-closure") (delay closure)))) env args (@ (@ hash-ref env (delay (list (delay closure) (delay "body")))) (@ hash-set env (delay (list (delay (@ hash-ref env (delay (list (delay closure) (delay "saved-env"))))) (delay (@ hash-ref env (delay (list (delay closure) (delay "arg-name"))))) (delay (@ map env (delay (list (delay (@ envlang->racket env (delay (list (delay (|\| #hash() env args (@ force env (@ car env (delay (list (delay args))))))) (delay env))))) (delay (@ force env args))))))))) args)))
«λ-env» ::=
(@ hash-set env (delay (list (delay env) (delay "λλ") (delay «λ»))))
«λ-app-env» ::=
(@ (|\| #hash() env args (@ list env (delay (list (delay (@ (@ (@ λλ env (delay (list (delay x) (delay (@ λλ env (delay (list (delay x) (delay 1)))))))) env (delay (list (delay 1)))) env (delay (list (delay 2))))) (delay (@ (@ (@ λλ env (delay (list (delay x) (delay (@ λλ env (delay (list (delay x) (delay x)))))))) env (delay (list (delay 1)))) env (delay (list (delay 2))))) (delay (@ (@ (@ λλ env (delay (list (delay x) (delay (@ λλ env (delay (list (delay y) (delay y)))))))) env (delay (list (delay 1)))) env (delay (list (delay 2))))) (delay (@ (@ (@ λλ env (delay (list (delay x) (delay (@ λλ env (delay (list (delay y) (delay x)))))))) env (delay (list (delay 1)))) env (delay (list (delay 2))))))))) «λ-env» #f)
«app» ::=
(|\| closure env args (@ (|\| closure env args (@ (@ force env (@ car env (delay (list (delay args))))) env (delay (@ cdr env (delay (list (delay args))))))) env (@ force env args)))
«λ-example» ::=
(@ (|\| #hash() env args (list (((λλ x (λλ x 1)) 1) 2) (((λλ x (λλ x x)) 1) 2) (((λλ x (λλ y y)) 1) 2) (((λλ x (λλ y x)) 1) 2))) «λ-app-env» #f)
(list (((λλ x (λλ x 1)) 1) 2) (((λλ x (λλ x x)) 1) 2) (((λλ x (λλ y y)) 1) 2) (((λλ x (λλ y x)) 1) 2))
«let» ::=
(|\| closure env args (@ (|\| (@ hash-set env (delay (list (delay (@ hash-set env (delay (list (delay (@ hash-set env (delay (list (delay (@ hash-set env (delay (list (delay (@ hash-set env (delay (list (delay empty-hash) (delay "arg-name") (delay (@ symbol->string env (delay (list (delay (@ promise-e env (@ car env (delay (list (delay (@ force env args))))))))))))))) (delay "value") (delay (@ car env (delay (list (delay (@ cdr env (delay (list (delay (@ force env args)))))))))))))) (delay "body") (delay (@ car env (delay (list (delay (@ cdr env (delay (list (delay (@ cdr env (delay (list (delay (@ force env args)))))))))))))))))) (delay "saved-env") (delay env))))) (delay "saved-closure") (delay closure)))) env args (@ (@ hash-ref env (delay (list (delay closure) (delay "body")))) (@ hash-set env (delay (list (delay (@ hash-ref env (delay (list (delay closure) (delay "saved-env"))))) (delay (@ hash-ref env (delay (list (delay closure) (delay "arg-name"))))) (delay (@ car env (delay (list (delay (@ map env (delay (list (delay (@ envlang->racket env (delay (list (delay (|\| #hash() env args (@ force env (@ car env (delay (list (delay args))))))) (delay env))))) (delay (@ force env args))))))))))))) args)) env (delay (list (delay (@ force env (@ car env (delay (list (delay (@ cdr env (delay (list (delay (@ force env args)))))))))))))))
env (hash-ref closure "value"))
«let-env» ::=
(@ hash-set env (delay (list (delay env) (delay "let") (delay «let»))))
«program» ::=
(let x 1 (let x (let x x x) x))
(@ (|\| #hash() env args (@ (|\| #hash() env args «program») «let-env» #f)) «λ-app-env» #f)
«*» ::=
(begin «program-with-basic-env»)