我想在一行中提供以下案例:
case s do
:a -> :b
:b -> :a
end
宏case
定义为case(condition, clauses)
。以下
quote do
case s do
:a -> :b
:b -> :a
end
end
给出:
{:case, [],
[{:s, [], Elixir}, [do: [{:->, [], [[:a], :b]}, {:->, [], [[:b], :a]}]]]}
从此处应该可以返回case(s, ???)
答案 0 :(得分:13)
有两种方法可以做到这一点。上面的答案之一是内联do end
调用获取:
case s do :a -> :b; :b -> :a end
另一个是使用块的, do:
关键字版本。我们需要对这两个表达式进行分组 - 否则编译器不会知道这两个子句都属于这种情况:
case s, do: (:a -> :b; :b -> :a)
如果没有parens,表达式将被解析为:
(case s, do: :a -> :b); :b -> :a
并且它自己的:b -> :a
不是elixir中的有效表达式。
答案 1 :(得分:5)
显然,您可以使用;
来实现您想要的目标:
case s do :a -> :b; :b -> :a end