小编cjb*_*aro的帖子

Elixir宏和bind_quoted

我有一个定义模块的宏.

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)

macros metaprogramming elixir

8
推荐指数
1
解决办法
1947
查看次数

Elasticsearch:过滤热门点击聚合

假设我有一个带有大量用户评论的 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)

elasticsearch

7
推荐指数
1
解决办法
3067
查看次数

标签 统计

elasticsearch ×1

elixir ×1

macros ×1

metaprogramming ×1