使用@eval在docstring中进行元编程

时间:2016-03-24 01:32:25

标签: julia

我试图将docstring与使用@eval宏定义的函数相关联;我还希望使用符号来动态生成文档字符串。

for (f, name) in ((:add, :addition), ... )
    @eval begin
        @doc "Documentation for $name" ->
        function f(args)
             ## FUNCTION BODY
        end
    end
end

虽然我可以在$name语句中成功引用@eval,但我无法在文档字符串本身中引用$name。它给出了错误UndefVarError: name not defined

1)有没有办法让它发挥作用?我已经尝试了多种方法来摆脱@doc范围并获取周围范围内的变量,但我还没有成功。

2)->语法的本质是什么?
我从Github获得了->语法,但是在Julia文档中我没有提到它,甚至在使用Julia的同时,我还没有遇到过它。

2 个答案:

答案 0 :(得分:3)

由@jverzani链接,所需要的只是额外的$。表达式插值需要一个$,字符串插值需要另一个for (f, name) in ((:add, "addition"), (:sub, "subtraction"), ...) @eval begin @doc """ This is the function $($name) """ function $f() ## FUNCTION BODY end end end 。最终代码如下:

eol

一旦你知道答案就超级简单......

答案 1 :(得分:1)

正如@scls所指出的那样,需要对Julia 0.5稍作修改。从文档的Advanced Usage部分开始,上面的示例现在应该类似于

for (f,n) in ((:foo, "foo"), (:bar, "bar"))
    @eval begin
                @doc "This is the function $($n)" $f
        function $f()
            println($n)
        end
    end
end

```