我有一个定义模块的宏.
defmodule Bar do
def bar do
IO.puts "I am #{inspect __MODULE__}"
end
end
defmodule MacroFun do
defmacro define_module(name) do
quote do
defmodule unquote(name) do
import Bar
def foo do
bar
IO.puts "I am #{inspect __MODULE__}"
end
end
end
end
end
defmodule Runner do
require MacroFun
def run do
MacroFun.define_module Foo
Foo.foo
end
end
Runner.run
Run Code Online (Sandbox Code Playgroud)
运行它的输出是:
I am Bar
I am Runner.Foo
Run Code Online (Sandbox Code Playgroud)
这是有道理的; MacroFun.define_module被调用,Runner.run因此模块被定义并因此嵌套在Runner模块下.
但是现在如果我MacroFun.define_module改为使用:bind_quoted选项:
defmacro define_module(name) do
quote bind_quoted: [name: …Run Code Online (Sandbox Code Playgroud) 假设我有一个带有大量用户评论的 Elasticsearch 索引:
{ "name": "chris", "date": "2016-01-01", "msg": "hi, foo"}
{ "name": "chris", "date": "2016-01-05", "msg": "bye, bar"}
{ "name": "aaron", "date": "2016-01-10", "msg": "who's bar"}
{ "name": "aaron", "date": "2016-01-15", "msg": "not foo"}
Run Code Online (Sandbox Code Playgroud)
首先,我想找到每个用户的最新评论。我可以通过top_hits聚合来做到这一点:
"aggs": {
"name": {
"terms": { "field": "name" },
"aggs": {
"latest_comment": {
"top_hits": {
"sort": [ {"date": { "order": "desc" } } ],
"size": 1
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这有效地给了我以下内容:
{ "name": "chris", "date": "2016-01-05", "msg": "bye, …Run Code Online (Sandbox Code Playgroud)