我有一个宏,它将模块名作为参数,我想调用该模块上的一个函数来获取一些数据,以便生成quote块。
示例:
defmacro my_macro(module) do
data = apply(module, :config, [])
# do something with data to generate the quote do end
end
显然,这是不起作用的,因为参数值是引用的。我可以在引号块中获取数据并采取相应的行动,但这会将整个逻辑放在使用我的宏的模块中,这是非常脏的。我想注入尽可能少的代码。
我遇到了一些Erlang代码,我正试图将这些代码转换为Elixir,以帮助我学习这两种语言并理解它们的不同之处。总的来说,宏和元编程是一个我还在努力思考的话题,所以希望您能理解我的困惑。
Erlang代码
-define(p2(MAT, REP),
p2(W = MAT ++ STM) -> m_rep(0, W, STM, REP))
% where m_rep is a function already defined.
在我看来,在上面的代码中,p2宏有两个单独的定义,它们映射到一个名为m_rep的私有函数。然而,在Elixir中,似乎只有一个模式匹配定义是可
我想知道elixir中的方法名到底是什么:
array = [1,2,3]
module_name = :lists
method_name = :nth # this not working
module_name.method_name(1, array) # error, undef function lists.method_name/2
module_name.nth(1, array) # returns 1, module_name is OK. It's an atom
但我几乎可以在erlang中做同样的事情:
我目前正在与另一名开发人员进行辩论,他向我保证,以下c++声明是原子性的:
x |= 0x1; // x is shared by multiple threads
在发布模式下使用VC++11编译,这将生成以下内容:
01121270 or dword ptr ds:[1124430h],1
另一个开发人员说,位操作是原子的,因此线程是安全的。我使用英特尔i7处理器的经验表明,情况并非如此。
我认为,对于多核处理器,任何共享内存写入都是不安全的,因为每个处理器都有缓存。但是在做了更多的研究之后,x86处理器似乎为处理器/核之间的内存操作顺序提供了一些保证,这意味着它应该是