Elixir 委托 Erlang 的模式匹配。
查看 Elixir 的源代码,用 Erlang 编写,这里似乎是处理匹配的代码:
elixir_clauses.erl:
match(Fun, Expr, #{current_vars := Current, unused_vars := {_, Counter} = Unused} = AfterE, BeforeE) ->
#{
context := Context,
prematch_vars := Prematch,
current_vars := {Read, _}
} = BeforeE,
CallE = BeforeE#{
context := match,
prematch_vars := {Read, Counter},
current_vars := Current,
unused_vars := Unused
},
{EExpr, #{current_vars := NewCurrent, unused_vars := NewUnused}} = Fun(Expr, CallE),
EndE = AfterE#{
context := Context,
prematch_vars := Prematch,
current_vars := NewCurrent,
unused_vars := NewUnused
},
{EExpr, EndE}.
这是 Erlang 代码,所以 Elixir 在这里委托给Erlang's = operator。既然如此,Robert Virding(Erlang 模式匹配代码的作者)对this related Erlang question 的回答很有用:
在“The
函数式编程语言的实现”,Simon Peyton
琼斯。这本书有点旧,但非常好。它还包含,其中
其他内容,编译列表推导的描述。
Erlang 编译器使用书中的这两种算法。