【问题标题】:Comprehensions that have a binary constructed from a generator具有从生成器构造的二进制文件的理解
【发布时间】:2018-11-01 17:07:39
【问题描述】:

我正在通过comprehension docs 寻找长生不老药,我对这个 sn-p 感到困惑:

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

具体来说,这部分:&lt;&lt;c &lt;- " hello world "&gt;&gt;

这到底是什么? 据我了解,c &lt;- " hello world " 是一个生成器,&lt;&lt;&gt;&gt; 是二进制语法。那么,把它放在一起它是一个生成器的二进制文件?很奇怪,好吧,但也许这类似于 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

如果代码不能独立存在,那么它在理解中如何工作?它在理解之外的其他任何地方都有效吗?

【问题讨论】:

    标签: elixir list-comprehension


    【解决方案1】:

    这只是 Elixir 选择用于二进制推导的语法。另一方面,Erlang 使用 &lt;= 而不是 &lt;- 进行二进制理解:

    % 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 中的一个宏,所以你可以定义自己的宏来接受相同的语法。

    它在理解之外的其他任何地方都有效吗?

    据我所知,没有。

    【讨论】:

    • 另外,可能值得一提的是,“子句可能独立存在”是定义有效性的一种非常糟糕的方式,因为即使是最简单的理解子句i &lt;- [1, 2, 3] 也无法独立存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多