Signed-off-by: Jim Pryor <profjim@jimpryor.net>
* **Type Variants and Pattern Matching** If you want to reproduce this kind of OCaml code:
* **Type Variants and Pattern Matching** If you want to reproduce this kind of OCaml code:
- type lambda_expression = Var of char | Lam of char * lambda_expression | App of lambda_expression * lambda_expression;;
+ # type lambda_expression = Var of char | Lam of char * lambda_expression | App of lambda_expression * lambda_expression;;
- let rec free_vars (expr : lambda_expression) : char list =
+ # let rec free_vars (expr : lambda_expression) : char list =
match expr with
| Var label -> [label]
| Lam (label, body) -> remove label (free_vars body)
| App (left, right) -> merge (free_vars left) (free_vars right);;
match expr with
| Var label -> [label]
| Lam (label, body) -> remove label (free_vars body)
| App (left, right) -> merge (free_vars left) (free_vars right);;
+ # free_vars (Lam ('x', (App (Var 'x', Var 'y'))));;
+ - : char list = ['y']
+
in Scheme, you have two choices. First, the quick hack:
; we use the symbols 'var and 'lam as tags, and assume
in Scheme, you have two choices. First, the quick hack:
; we use the symbols 'var and 'lam as tags, and assume
(lam (label body) (remove label (free-vars body)))
(app (left right) (remove-duplicates (append (free-vars left) (free-vars right))))))
(lam (label body) (remove label (free-vars body)))
(app (left right) (remove-duplicates (append (free-vars left) (free-vars right))))))
+ (free-vars (lam 'x (app (var 'x) (var 'y))))
+ ; evaluates to '(y)
* Scheme has excellent support for working with implicit or "first-class" **continuations**, using either `call/cc` or any of various delimited continuation operators. See <http://docs.racket-lang.org/reference/cont.html?q=shift&q=do#%28part._.Classical_.Control_.Operators%29>.
* Scheme has excellent support for working with implicit or "first-class" **continuations**, using either `call/cc` or any of various delimited continuation operators. See <http://docs.racket-lang.org/reference/cont.html?q=shift&q=do#%28part._.Classical_.Control_.Operators%29>.