在Elixir中do表达式中使用冒号

  • 本文关键字:表达式 Elixir do elixir
  • 更新时间 :
  • 英文 :


我正在学习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

简而言之,你要么需要一个没有冒号的doend,要么你需要一个没有冒号的do:end,但你不能有一个带有冒号和后跟enddo:

最新更新