gpt4 book ai didi

macros - 可以使用 Julia 宏来生成基于特定功能实现的代码吗?

转载 作者:行者123 更新时间:2023-12-03 23:07:08 25 4
gpt4 key购买 nike

我对 Julia 很陌生,我正在学习元编程。

我想编写一个宏,它接收输入一个函数并根据其输入的实现细节返回另一个函数。

例如给出:

function f(x)
x + 100
end

function g(x)
f(x)*x
end

function h(x)
g(x)-0.5*f(x)
end

我想编写一个返回类似内容的宏:
function h_traced(x) 
f = x + 100
println("loc 1 x: ", x)
g = f * x
println("loc 2 x: ", x)
res = g - 0.5 * f
println("loc 3 x: ", x)

现在,code_lowered 和 code_typed 似乎都以 CodeInfo 的形式返回了 AST,但是当我尝试在宏中以编程方式使用它时,我得到了空对象。
macro myExpand(f)
body = code_lowered(f)
println("myExpand Body lenght: ",length(body))
end

像这样称呼
@myExpand :(h)

但是宏之外的相同调用可以正常工作。
code_lowered(h)

最后甚至以下返回一个空的 CodeInfo。
macro myExpand(f)
body = code_lowered(Symbol("h"))
println("myExpand Body lenght: ",length(body))
end

这可能是微不足道的,但我无法弄清楚为什么 h 符号不解析为定义的函数。我是否遗漏了有关符号范围的信息?

最佳答案

我发现将宏视为一种将输入语法转换为输出语法的方法很有用。

所以你可以很好地定义一个宏@my_macro这样

@my_macro function h(x)
g(x)-0.5*f(x)
end

会扩展到类似的东西
function h_traced(x)
println("entering function: x=", x)
g(x)-0.5*f(x)
end

但是对于这样的宏, h只是一个名称,一个标识符(技术上是 Symbol ),可以转换为 h_traced . h不是绑定(bind)到此名称的函数(与 x = 2 相同的方式涉及将名称 x 绑定(bind)到整数值 2 ,但 x 不是 2x 只是可用于引用 2 的名称)。与此相反,当您调用 code_lowered(h) , h首先得到评估,然后 code_lowered将其值(这是一个函数)作为参数传递。

回到我们的宏:扩展为一个涉及 g 定义的表达式和 f比单纯的语法转换走得更远:我们要离开纯粹的语法领域,因为这样的转换需要“理解”这些是函数,查找它们的定义等等。

你想对了 code_lowered和 friend 们:这是 IMO 对您要实现的目标的足够抽象级别。您可能应该查看 Cassette.jl 之类的工具或 IRTools.jl .话虽如此,如果您对 Julia 还比较陌生,那么在深入研究此类主题之前,您可能希望多熟悉该语言。

关于macros - 可以使用 Julia 宏来生成基于特定功能实现的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61824058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com