defmodule Hologram.Compiler.Evaluator do def evaluate(ast, bindings) do bindings = bindings |> Map.put(:bindings, bindings) |> Enum.map(fn {key, value} -> {:"hologram_#{key}__", value} end) replace_module_attributes(ast) |> Code.eval_quoted(bindings) |> elem(0) end defp replace_module_attributes({:@, metadata, [{name, _, _}]}) do {:"hologram_#{name}__", metadata, nil} end defp replace_module_attributes(ast) when is_list(ast) do Enum.map(ast, &replace_module_attributes/1) end defp replace_module_attributes(ast) when is_tuple(ast) do Tuple.to_list(ast) |> Enum.map(&replace_module_attributes/1) |> List.to_tuple() end defp replace_module_attributes(ast), do: ast end