elixir的管道运算符用起来非常爽, 但是也有一点点小瑕疵, 举个我经常遇到的栗子
#我们有一个英文字典的txt文件, 每行一个中英对照
#格式是: hello=你好
#我们想要把这个txt转成一个map
path #这是我们要读的文件的路径
|> File.stream!() #我们把文件按行读出来
|> Stream.map(&String.trim/1) #然后每一行都trim一下
|> Stream.filter(&(String.length(&1)>0)) #排除掉空行
|> Stream.map(&String.split(&1, "=")) #用等号隔开
|> Stream.map(&(length(&1)==2)) #排除掉格式不对的
|> Map.new(fn [k, v] -> {k, v} end) #一气呵成的转成map了!
# 然后我得给这个map起个帅气的名字, 叫做map1
# 我要把结果赋值给map1, 等等, 我要跑回第一行赋值???
要是能在后面加一行来赋值就好啦, 比如:
|> as(map1)
这样才叫一气呵成啊
首先了解一下管道运算符的运行规则: 其实就是将管道运算符左边的代码插到右边的调用的第一个参数中
不管上面写了多少乱七八糟的东西, 都能当作一个x塞到下一个管道的第一个参数中
那最后一行的调用就变成了 as(x, map1)
我们想将 as(x, map1) 转换成map1 = x, 那转成ast看看
很简单吧
那照着来抄个宏
defmacro as(value, match) do
{:=, [], [match, value]}
end
测试一下, 一发通过
感觉世界又变得美好了一点