summaryrefslogtreecommitdiff
path: root/elixir/ast.ex
diff options
context:
space:
mode:
authorArnaud Bailly <arnaud.bailly@iohk.io>2025-01-25 10:45:41 +0100
committerArnaud Bailly <arnaud.bailly@iohk.io>2025-01-25 10:45:41 +0100
commit7752d73216578d5961751b5d0535088d384b4aa6 (patch)
tree786e46fe1276e93ade0a48398cd4c9ac13081707 /elixir/ast.ex
parentd6f68e919db51d366c8ca3c1509bea12aa81d692 (diff)
downloadlambda-nantes-7752d73216578d5961751b5d0535088d384b4aa6.tar.gz
Move λ-calcul workshop code to subdirectory
Diffstat (limited to 'elixir/ast.ex')
-rw-r--r--elixir/ast.ex34
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