16、Elixir宏:上下文、卫生性及应用实践

Elixir宏:上下文、卫生性及应用实践

1. 上下文与宏卫生性

宏在注入代码时,需要特别关注调用者上下文和宏自身上下文。宏注入的代码不能默认某些变量可用。例如,以下宏定义尝试访问调用者上下文的变量:

defmodule ContextInfo do
  defmacro grab_caller_context do
    quote do
      IO.puts x
    end
  end
end

iex 中加载该模块并调用宏,会得到编译错误:

iex(1)> c "context.exs"
[ContextInfo]
iex(2)> import ContextInfo
nil
iex(3)> x = 42
42
iex(4)> grab_caller_context
** (CompileError) iex:4: undefined function x/0
    expanding macro: ContextInfo.grab_caller_context/0
    iex:4: (file)

同样,宏不能安全地注入改变调用者上下文或环境的代码。例如,向 ContextInfo 模块添加一个尝试改变 x 值的宏:

defmacro inject_context_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值