首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写带有参数的函数的DSL?

如何编写带有参数的函数的DSL?
EN

Stack Overflow用户
提问于 2018-06-10 03:05:19
回答 1查看 114关注 0票数 0

我想要定义一个宏,这样我就可以向它传递一个do块,并让这个宏创建一个函数来调用这个块,和一个参数。我遇到了一个鸡蛋问题,因为下面的代码抱怨没有定义name

代码语言:javascript
复制
defmodule MyMacro do
  defmacro greet(do: block) do
    quote do
      def hello(name), do: unquote(block)
    end
  end
end

defmodule Test do
  import MyMacro
  greet do
    IO.puts("Hello, #{name}!")
  end
end

试图编译此代码将导致:

代码语言:javascript
复制
(CompileError) iex:6: undefined function name/0
(stdlib) lists.erl:1338: :lists.foreach/2
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(iex) lib/iex/evaluator.ex:250: IEx.Evaluator.handle_eval/5

据我理解,这甚至在它到达我的宏之前就已经崩溃了,因为长生不老药试图在调用我的宏之前为do块生成AST,但是name是未定义的。

我的目标是能够在编译DSL之后调用Test.hello("world")。这有可能在长生不老药吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-10 03:14:47

灵丹妙药的宏是卫生学,因此如果在宏的quote中声明变量,调用方将无法使用它。您可以通过用var!包装变量的声明来禁用它。

代码语言:javascript
复制
quote do
  def hello(var!(name)), do: unquote(block)
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50780247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档