Godfavoredone 2019-06-21
在 lisp 里我们可以这样写
(* 25 4 12) 1200 (+ 21 35 12 7) 75 (+ (* 3 5) (- 10 6)) 19
在 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
纯属娱乐:)