我正在学习Elixir,我似乎不能理解:
的用法。以下三行说明了这一点:
iex(1)> quote do: 1 + 3
{:+, [context: Elixir, import: Kernel], [1, 3]}
# no `:` but now I need `end`
iex(2)> quote do 1 + 3 end
{:+, [context: Elixir, import: Kernel], [1, 3]}
# Oops! an error
iex(3)> quote do: 1+ 2 end
** (SyntaxError) iex:10:16: unexpected reserved word: end
:
在这里做什么?如果我在上面的第三个输入中使用end
和:
,为什么我会得到一个语法错误?
Elixir中有一个关于原子和冒号的问题在这里,但它没有回答我的问题(至少对我来说)。
do
-end
块有特殊的语法。语法参考中的示例(略微缩写)显示
if true do
this
end
转换为
if(true, do: (this))
后面的do: (this)
是作为最后参数的关键字语法;它是普通的key: expression
语法。因此,do:
(和else:
,如果存在的话)关键字将被打包到关键字列表
if(true, [do: (this)])
if(true, [{:do, (this)}])
,从那里Kernel.if/2
是一个宏。
在您的示例中,适用相同的语法,除了您调用Kernel.SpecialForms.quote/2
。
简而言之,你要么需要一个没有冒号的do
和end
,要么你需要一个没有冒号的do:
和end
,但你不能有一个带有冒号和后跟end
的do:
。