首页 > 其他分享 >elixir before_compile && on_definition 简单使用

elixir before_compile && on_definition 简单使用

时间:2024-01-15 10:36:06浏览次数:27  
标签:__ definition end do compile elixir before

elixir 提供了一些方便的模块属性,可以让我们方便的进行elixir 的扩展(尤其是进行元编程的时候)
比如elixir_agent 就使用到了before_compile以及on_definition ,方便进行trace 的处理

on_definition 的简单使用

  • 参考demo

内容来自官方,可以实现输出函数的一些信息

 
defmodule Hooks do
  def on_def(_env, kind, name, args, guards, body) do
    IO.puts("Defining #{kind} named #{name} with args:")
    IO.inspect(args)
    IO.puts("and guards")
    IO.inspect(guards)
    IO.puts("and body")
    IO.puts(Macro.to_string(body))
  end
end
 
defmodule MyModule do
  @on_definition {Hooks, :on_def}
 
  def hello(arg) when is_binary(arg) or is_list(arg) do
    "Hello" <> to_string(arg)
  end
 
  def hello(_) do
    :ok
  end
end

before_compile 的简单使用

  • 参考demo
defmodule MyModule do
  @before_compile {Dalong, :__before_compile__}
  def hello(arg) when is_binary(arg) or is_list(arg) do
    "Hello" <> to_string(arg)
  end
  def hello(_) do
    :ok
  end
end

Dalong 模块中__before_compile__ 的定义

defmacro __before_compile__(env) do
    IO.puts "Before compilation!"
    IO.inspect env
    quote do
       IO.puts "Before compilation!"
    end
end

elixir_agent 的使用

elixir_agent 的使用是自己开发了一个macro,通过use 统一导入,使用如下

 defmacro __using__(_args) do
    quote do
      require NewRelic
      require NewRelic.Tracer.Macro
      require NewRelic.Tracer.Report
      Module.register_attribute(__MODULE__, :nr_tracers, accumulate: true)
      Module.register_attribute(__MODULE__, :nr_last_tracer, accumulate: false)
      @before_compile NewRelic.Tracer.Macro
      @on_definition NewRelic.Tracer.Macro
    end
  end

说明

elixir 的一些玩法比较有意思,看似缺少一些语言的能力,但是kernel 提供的其他功能,实现起来反而更加灵活强大,以下参考链接中对于上述属性
有完整的介绍可以看看

参考资料

https://hexdocs.pm/elixir/1.14.5/Module.html
https://github.com/newrelic/elixir_agent

标签:__,definition,end,do,compile,elixir,before
From: https://www.cnblogs.com/rongfengliang/p/17964868

相关文章

  • ARM Memory Compiler 学习
    我们一共拿到了两个版本的工具,分别是sram_dp_hsd_svt_mvt和sram_sp_hde_svt_mvt,其中dp是双端口dualport,sp是单端口singleport,dp的是hsd,即highspeed,sp的是hen即highdensity,后面的svt_mvt是管子类型。直接找到工具里面的bin,然后运行可执行文件就可以打开gui。我们看一下这个me......
  • Compileflow工作流引擎使用讲解
    目录1Compileflow1.1简介1.2特点1.3Compileflow插件下载1.4main方法调用1.4.1pom.xml1.4.2新建bpm文件1.4.3各个节点绑定方法1.4.4测试方法1.5bpm各个标签说明1.5.1BPM根节点1.5.2全局变量1.5.3开始节点:start1.5.4结束节点:end1.5.5自动节点:autoTask--流程节......
  • python 里面的eval exec 还有compile
    一、简介二、操作三、问题 一、简介evalexec方法是python里面内置的方法,用于将字符串代码或者code对象,进行执行的方法。参考至:这里二、操作1eval计算指定表达式的值。也就是说它要执行的python代码只能是单个表达式(注意eval不支持任何形式的赋值操作......
  • oban elixir 强大的任务处理框架
    obanelixir强大的任务处理框架,后端存储基于了sqlite或者pg包含的特性IsolatedQueuesQueueControlResilientQueuesJobCancelingTriggeredExecutionUniqueJobsScheduledJobsPeriodic(CRON)JobsJobPriorityHistoricMetricsNodeMetricsGracefulShutdownTelemetryInteg......
  • elixir erlang 简单调用学习
    实际上基于elixir的mix进行erlang以及elixir的互调用开发处理是很方便的,mix直接就包含了构建erlang代码同时对于代码的互调用,只要使用符合语言格式要求就行了,以下是一个简单的互调用学习项目准备项目结构 ├──README.md├──lib│├──a.ex│└──er_app......
  • elixir mix observer 工具的使用
    默认elixirmix没有添加observer工具的依赖直接运行会提示找不到方法解决方法添加几个额外的依赖主要是observer,:wx,:runtime_tools这几个 defapplicationdo[extra_applications:[:logger,:observer,:wx,:runtime_tools]]end说明注意可能不同版本elixi......
  • elixir config 简单说明
    elixir的config模块,实际上就是标准的方法,只是mix项目中在使用的时候使用了dsl模式的,没有使用包含括号的模式调用给人一种似乎觉得有点怪的调用模式参考代码只说明config方法,实际上Config模块还包含了其他方法mix中的调用 importConfigconfig:ecto_demo,Dalong.App,......
  • elixir mix 自定义任务
    elixir的mix比较灵活,同时也比较强大,很多时候我们可以自己定义一个任务,方便运行以及构建,不少三方框架会提供一些方便的cli,一般也会使用此方法比如ectoorm框架,以下是一个简单的自定义task学习参考开发目录位置这个实际上都f放那里可以,只是有一个简单的约定,建议放到lib/mix/......
  • elixir 模块名一些参考资料
    elixir的模块名实际上是一个atom类型的数据,以下是一些参考资料参考使用比如一个mixsup项目defmoduleEctoDemo.ApplicationdouseApplication@impltruedefstart(_type,_args)dochildren=[]#此处name实际上就是使用了模块名格式的,因为是......
  • elixir defdelegate 使用
    delegate模式,在不少语言都支持,有些是隐式的(一些早期语言),有些是显式的(新语言,kotlin,swift等)elixir也支持delegate处理,还是比较方便的,以下是一个简单的使用定义原始方法default.ex defmoduleDefaultdodeflogin(name,password)doIO.puts"fromDefault.login"......