这个Elixir表达式的正确语法是什么?

时间:2017-04-23 07:02:17

标签: elixir anonymous-function

我已经提交了这段代码片段,作者尚未对此进行测试,

|> (fn l ->[?[, Enum.map(l, &([inspect(limit: :infinity), ?\n])), ?]] end).()

作为一系列流水线命令的一部分,使用DataMorph库将数据从CSV文件转换为struct,并将结果输出为常规Elixir列表以输入Elixir源 - 即添加周围的括号,并用逗号分隔列表中的元素。

这就是序列的意思:

File.stream!('tmp.csv') \
|> DataMorph.structs_from_csv("open-register", :iso_country) \
|> (fn l ->[?[, Enum.map(l, &([inspect(limit: :infinity), ?\n])), ?]] end).()
|> (&File.write('output.txt',&1)).()

这是在iex中运行时的错误消息:

* (CompileError) iex:55: invalid args for &, expected an expression in the format of &Mod.fun/arity, &local/arity or a capture containing at least one argument as &1, got: [inspect(limit: :infinity), 10]
    (elixir) expanding macro: Kernel.|>/2
             iex:55: (file)

摘录中的错误在哪里?

1 个答案:

答案 0 :(得分:2)

可以通过添加&1作为部分应用程序语法的第一个参数来修复语法错误:

|> (fn l ->[?[, Enum.map(l, &([inspect(&1, limit: :infinity), ?\n])), ?]] end).()

此代码不包含分隔逗号。为此,如果你想继续制作一个iolist,我建议你使用Enum.intersperse

iex(1)> [1, 2, [3], [4, 5]] |> (fn l ->[?[, Enum.map(l, &inspect(&1, limit: :infinity)) |> Enum.intersperse(",\n"), ?]] end).() |> IO.puts
[1,
2,
[3],
[4, 5]]

为了便于阅读,我还将其分为多行:

[1, 2, [3], [4, 5]]
|> (fn list ->
  elements = Enum.map(list, &inspect(&1, limit: :infinity)) |> Enum.intersperse(",\n")
  [?[, elements, ?]]
end).()
|> IO.puts