diff options
| author | Arnaud Bailly <arnaud.bailly@iohk.io> | 2025-01-25 10:45:41 +0100 |
|---|---|---|
| committer | Arnaud Bailly <arnaud.bailly@iohk.io> | 2025-01-25 10:45:41 +0100 |
| commit | 7752d73216578d5961751b5d0535088d384b4aa6 (patch) | |
| tree | 786e46fe1276e93ade0a48398cd4c9ac13081707 /elixir/ast.ex | |
| parent | d6f68e919db51d366c8ca3c1509bea12aa81d692 (diff) | |
| download | lambda-nantes-7752d73216578d5961751b5d0535088d384b4aa6.tar.gz | |
Move λ-calcul workshop code to subdirectory
Diffstat (limited to 'elixir/ast.ex')
| -rw-r--r-- | elixir/ast.ex | 34 |
1 files changed, 0 insertions, 34 deletions
diff --git a/elixir/ast.ex b/elixir/ast.ex deleted file mode 100644 index 4305b7b..0000000 --- a/elixir/ast.ex +++ /dev/null @@ -1,34 +0,0 @@ -defmodule Ast do - def var(name), do: {:var, name} - def abs(param, body), do: {:abs, param, body} - def app(func, param), do: {:app, func, param} - - def pprint(expr) do - case expr do - {:var, name} -> name - {:abs, param, body} -> "(λ #{param} . #{pprint(body)})" - {:app, func, param} -> "#{pprint(func)} #{pprint(param)}" - end - end - - def free_vars(expr) do - case expr do - {:var, name} -> MapSet.new([name]) - {:abs, param, body} -> MapSet.delete(free_vars(body), param) - {:app, func, param} -> MapSet.union(free_vars(func), free_vars(param)) - end - end - - def subst(expr, old_var, new_expr) do - case expr do - {:var, name} -> - if name == old_var, do: new_expr, else: expr - - {:abs, param, body} -> - if param == old_var, do: expr, else: {:abs, param, subst(body, old_var, new_expr)} - - {:app, func, param} -> - {:app, subst(func, old_var, new_expr), subst(param, old_var, new_expr)} - end - end -end |
