具有从生成器

时间:2018-05-22 20:32:11

标签: elixir list-comprehension

我正在查看comprehension docs的长生不老药,我对此片段感到困惑:

for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>

具体来说,这部分:<<c <- " hello world ">>

这究竟是什么?从我的理解c <- " hello world "是一个生成器,<<>>是二进制语法。那么,把它放在一起它是一个发电机的二进制?很奇怪,好吧,但也许这类似于python的列表理解,例如[x for x in (1..3)]

然而,它看起来并非如此,因为该声明无法独立存在:

iex(2)>  <<c <- " hello world ">>
** (CompileError) iex:2: undefined function <-/2
    (elixir) src/elixir_bitstring.erl:65: :elixir_bitstring.expand_expr/4
    (elixir) src/elixir_bitstring.erl:32: :elixir_bitstring.expand/6
    (elixir) src/elixir_bitstring.erl:12: :elixir_bitstring.expand/4

如果代码不能自立,那么它在理解中如何运作?它是否在理解之外的其他地方有效?

1 个答案:

答案 0 :(得分:1)

这只是Elixir选择用于二进制理解的语法。另一方面,Erlang使用<=代替<-来进行二元理解:

% List Comprehension
1> [ X || X <- [1, 2, 3] ].
[1,2,3]
% Binary Comprehension
2> [ X || <<X>> <= <<1, 2, 3>> ].
[1,2,3]
  

如果代码不能独立存在,那么它在理解中如何运作?

此语法是有效的Elixir代码:

iex(1)> quote do: <<c <- " hello world ">>
{:<<>>, [], [{:<-, [], [{:c, [], Elixir}, " hello world "]}]}

但据我所知,只有for宏使用它。 for只是Elixir中的一个宏,因此您可以定义自己的宏,这些宏接受相同的语法。

  

除了理解之外的其他地方有效吗?

据我所知,没有。