1 Tests and examples for envlang/tiny
1.1 Identity
(λ (x) x)
(⧵ env env args args)
(⧵ #f env args args)
1.2 Dummy value
1.3 Example: identity applied to identity
1.4 False
a.k.a second-of-two
(λ (if-true) (λ (if-false) if-false))
(⧵ env env args (⧵ args env args args))
(⧵ #f env args (⧵ args env args args))
1.5 True
a.k.a first-of-two
(λ (if-true) (λ (if-false) if-true))
(⧵ env env args (⧵ args env args captured))
(⧵ #f env args (⧵ args env args captured))
1.5.1 Boolean usage example: if true
1.5.2 Boolean usage example: if false
1.6 Pairs
(λ (a) (λ (b) (λ (f) ((f a) b))))
; ↑ a a ↓ ↑ b a ↓ f ↑ f ↓ a ↓ (⧵ env env args (⧵ args env args (⧵ captured env args (@ (@ args env captured) env BBBBBBBB))))
; ↑ a a ↓ ↑ b b ↓ f ↑ f ↓ b ↓ (⧵ env env args (⧵ args env args (⧵ args env args (@ (@ args env AAAAAAAA) env captured))))
Can’t be done because our capture can only close over a single value. We use a primitive:
×
×
(⧵ #f env args (@ (@ args env «true-result») env «false-result»))
1.6.1 Fst
(λ (p) (p «true-λ»))
(⧵ captured env args (@ args env «true»))
1.6.2 Snd
(λ (p) (p «false-λ»))
(⧵ captured env args (@ args env «false»))
1.7 Either
1.7.1 Left
(λ (v) (λ (if-left) (λ (if-right) (if-left v))))
; ↑ v v ↓ ↑ if-left ↓ if-left ↓ v ↑ if-right ↓ if-left × v (⧵ env env args (⧵ args env args (⧵ (@ «pair» args captured) env args (@ captured env «appfv»))))
; ↑ f f ↓ ↑ v ↓ f ↓ v (⧵ env env args (⧵ args env args (@ captured env args)))
(⧵ #f env args (⧵ args env args (⧵ (@ × args captured) env args (@ captured env (⧵ env env args (⧵ args env args (@ captured env args)))))))
1.7.2 Right
(λ (v) (λ (if-left) (λ (if-right) (if-right v))))
; ↑ v ↓v↑ if-left ↓ v ↑ ↑ if-right ↓ if-right ↓ v (⧵ env env args (⧵ args env args (⧵ captured env args (@ args env captured))))
(⧵ #f env args (⧵ args env args (⧵ captured env args (@ args env captured))))
1.8 If
(λ (c) (λ (if-true) (λ (if-false) ((c if-true) if-false))))
When passed a boolean as the first argument (as should be the case), it is equivalent to:
(λ (c) c)
1.8.1 Match "either"
(λ (either) (λ (if-left) (λ (if-right) ((either if-true) if-false))))
When passed a constructor of the "either" variant as the first argument (as should be the case), it is equivalent to:
(((«match-either-λ» («left-λ» «id-λ»)) «id-λ») (λ (v) «false-λ»))
(@ (@ (@ «match-either» env (@ «left» env «id»)) env «id») env (⧵ captured env args «false»))
(@ (@ (@ «match-either» env (@ «right» env «id»)) env (⧵ captured env args «false»)) env «id»)
1.9 Null
(⧵ (⧵ #f env args args) env args (⧵ (@ × args captured) env args (@ captured env (⧵ env env args (⧵ args env args (@ captured env args))))))
1.10 Cons
(⧵ #f env args (⧵ args env args (@ (⧵ env env args (⧵ args env args (⧵ captured env args (@ args env captured)))) env (@ × captured args))))
1.10.1 Match "list"
1.11 null?
(λ (l) (((«match-null-cons-λ» l) (λ (v) «true»)) (λ (v) «false-λ»)))
(⧵ captured env args (@ (@ (@ «match-null-cons» env args) env (⧵ captured env args «true»)) env (⧵ captured env args «false»)))
1.12 Car
Since we don’t have an error reporting mechanism, we make (car null) = null and (cdr null) = null
(λ (l) (((«match-null-cons-λ» l) «null-λ») «fst-λ»))
(⧵ captured env args (@ (@ (@ «match-null-cons» env args) env (⧵ captured env args «null»)) env «fst»))
1.13 Cdr
Since we don’t have an error reporting mechanism, we make (car null) = null and (cdr null) = null
(λ (l) (((«match-null-cons-λ» l) «null-λ») «snd-λ»))
(⧵ captured env args (@ (@ (@ «match-null-cons» env args) env (⧵ captured env args «null»)) env «snd»))
(⧵ (⧵ #f env args (@ (@ args env «false-result») env «null-result»)) env args (⧵ captured env args (@ args env captured)))
1.14 Zero
1.15 Not
1.16 And
; a a b a b (⧵ captured env args (⧵ args env args (@ (@ (@ «if» env captured) env args) env «false»)))
1.17 Or
; a a b a b (⧵ captured env args (⧵ args env args (@ (@ (@ «if» env captured) env «true») env args)))
1.18 Equal bools
(⧵ captured env args (⧵ args env args (@ (@ (@ «if» env captured) env args) env (@ «not» env args))))
1.19 Z combinator
(λ (f) («half-Z-λ» «half-Z-λ»))
(λ (x) (f (λ (v) ((x x) v))))
; ↓f↑ ↑ x ↓ f ↓x↑ ↑v ↓ x ↓ x ↓ v (⧵ args env args (@ captured env (⧵ args env args (@ (@ captured env captured) env args))))
1.20 Equality of lists
(λ (recur) (λ (cmp) (λ (a) (λ (b) ((«if-λ» ((«or-λ» («null?-λ» a)) («null?-λ» b)) (λ (_) ((«and-λ» («null?-λ» a)) («null?-λ» b))) (λ (_) ((«if-λ» ((cmp («car-λ» a)) («car-λ» b)) (λ (_) (((recur cmp) («cdr-λ» a)) («cdr-λ» b))) (λ (_) «false-λ»)) «dummy-λ»))) «dummy-λ»)))))
; recur (⧵ captured env args ; recur cmp (⧵ args env args ; recur cmp a (⧵ (@ «pair» captured args) env args ; recur+cmp a b (⧵ (@ «pair» captured args) env args ; a b (@ (@ (@ (@ «if» env (@ (@ «or» env (@ «null?» env (@ «snd» env captured))) env (@ «null?» env args))) ; a b env (⧵ captured env args (@ (@ «and» env (@ «null?» env (@ «snd» env captured))) env (@ «null?» env args)))) ; cmp a env (⧵ captured env args (@ (@ (@ (@ «if» env (@ (@ (@ «snd» env (@ «fst» env captured)) env (@ «car» env (@ «snd» env captured))) ; b env (@ «car» env args))) env (⧵ captured env args ; recur (@ (@ (@ (@ «fst» env (@ «fst» env captured)) ; cmp env (@ «snd» env (@ «fst» env captured))) ; a env (@ «cdr» env (@ «snd» env captured))) ; b env (@ «cdr» env args)))) env (⧵ captured env args «false»)) env args))) env args)))))
(@ «Z» env «eqlist-noZ»)
;; These return true (@ (@ «eqlist-bool» env «null») env «null») (@ (@ «eqlist-bool» env (@ (@ «cons» env «true») env «null»)) env (@ (@ «cons» env «true») env «null»)) (@ (@ «eqlist-bool» env (@ (@ «cons» env «false») env «null»)) env (@ (@ «cons» env «false») env «null»)) (@ (@ «eqlist-bool» env (@ (@ «cons» env «false») env (@ (@ «cons» env «true») env «null»))) env (@ (@ «cons» env «false») env (@ (@ «cons» env «true») env «null»))) ;; These return false (@ (@ «eqlist-bool» env «null») env (@ (@ «cons» env «true») env «null»)) (@ (@ «eqlist-bool» env (@ (@ «cons» env «true») env «null»)) env «null») (@ (@ «eqlist-bool» env (@ (@ «cons» env «true») env (@ (@ «cons» env «true») env «null»))) env «null») (@ (@ «eqlist-bool» env «null») env (@ (@ «cons» env «true») env (@ (@ «cons» env «true») env «null»))) (@ (@ «eqlist-bool» env (@ (@ «cons» env «true») env «null»)) env (@ (@ «cons» env «false») env «null»)) (@ (@ «eqlist-bool» env (@ (@ «cons» env «false») env (@ (@ «cons» env «true») env «null»))) env (@ (@ «cons» env «false») env (@ (@ «cons» env «false») env «null»)))
1.21 Associative lists
(λ (recur) (λ (k) (λ (l) ((if («null?-λ» l) (λ (_) «false-λ») ((«if-λ» (<eqlist-list-bool-λ> («fst-λ» («car-λ» l)) k) (λ (_) («snd-λ» («car-λ» l))) (λ (_) (recur k («cdr-λ» l)))) «dummy-λ»)) «dummy-λ»))))
; ↑recur (⧵ captured env args ; ↓recur↑ ↓k↑ (⧵ args env args ; ↓recur ↓k ↓l (⧵ (@ «pair» captured args) env args (@ ; ↓l (@ (@ (@ «if» env (@ «null?» env args)) env (⧵ captured env args «false»)) env (⧵ captured env args ; ↓l ↓k (@ (@ (@ (@ «if» env (@ (@ «eqlist-list-bool» env (@ «car» env (@ «car» env args))) env (@ «snd» env captured))) ; ↓l env (⧵ captured env args(@ «cdr» env (@ «car» env args)))) ; ↓recur ↓k ↓l env (⧵ captured env args(@ (@ (@ «fst» env captured) env (@ «snd» env captured)) env (@ «cdr» env args)))) env args))) env args))))
(@ «Z» env «assoc-noZ»)
(@ (@ «cons-bits» env «bit-1») env (@ (@ «cons-bits» env «bit-1») env «null-bits»))
(@ (@ «cons-bits» env «bit-1») env (@ (@ «cons-bits» env «bit-0») env «null-bits»))
(@ (@ «cons-bytes» env «assoc-example-letter-a») env (@ (@ «cons-bytes» env «assoc-example-letter-b») env «null-bytes»))
(@ (@ «cons-bytes» env «assoc-example-letter-a») env (@ (@ «cons-bytes» env «assoc-example-letter-a») env «null-bytes»))
(@ (@ «cons-k-v» env «assoc-example-other-k») env «false»)
(@ (@ «cons-k-v» env «assoc-example-k») env «true»)
(@ (@ «env-push» env «assoc-example-other-kv») env (@ (@ «env-push» env «assoc-example-kv») env «env-null»))
(@ (@ «env-ref» env «assoc-example-k») env «assoc-example-env»)
1.22 environment-manipulation functions
1.23 todo
(@ (⧵ #hash() env args (list (((λλ x (λλ x 1)) 1) 2) (((λλ x (λλ x x)) 1) 2) (((λλ x (λλ y y)) 1) 2) (((λλ x (λλ y x)) 1) 2))) (hash-set env "λλ" «todo-lam-impl») (list))
(⧵ #hash() env args (⧵ (hash "arg-name" (symbol->string (@ inspect-promise-root 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 (make-racket-proc (⧵ #hash() env args (@ force env (car args))) env) (@ force env args))) args)))