[elixir! #0025] 在 elixir 中模仿 lisp :)

Godfavoredone 2019-06-21

Lisp

在 lisp 里我们可以这样写

(* 25 4 12)
1200

(+ 21 35 12 7)
75

(+ (* 3 5) (- 10 6))
19

Elixir

在 elixir 中我们可以利用宏来达到类似的效果

defmodule Lisp do
  def exp(operator) do
    {:ok, term} = Code.string_to_quoted "fn x, acc -> acc #{operator} x end"
    term
  end

  defmacro comb(operator, operands) do
    quote do
      Enum.reduce unquote(operands), unquote(exp(operator))
    end
  end
end

来看看效果

iex(1)> c "lisp.ex"
[Lisp]
iex(2)> import Lisp
Lisp
iex(3)> comb(:*, [25,4,12])
1200
iex(4)> comb(:+, [21,35,12,7])
75
iex(5)> comb(:+, [comb(:*, [3,5]), comb(:-, [10,6])])
19

纯属娱乐:)

相关推荐