结合字符串和表达式插值

时间:2016-03-31 19:04:41

标签: julia

我在组合表达式和字符串插值方面遇到了麻烦。我想做这样的事情:

a = [:foo, :bar]
b = [:printfoo, :printbar]

for (str, fn) in zip(a,b)
  @eval begin
    """ 
    ```
    $fn()
    ```
    Prints $str.
    """
    $fn() = println("$str")
  end 
end

我想要的输出是两个函数,一个可能看起来像键入的函数,如

"""    
```
printfoo()
```
Prints foo.
"""
printfoo() = println("foo")

相反,我得到的表达式看起来像这样(当我使用quote而不是@eval begin时):

```\n$(fn)()\n```\nPrints $(str).\n" # /home/..., line 12:
    printfoo() = begin  # /home/..., line 12:
            println("$(str)")
        end

我不明白为什么使用相同的$x语法,我只想在引用的("...")区域之外执行插值。我已经尝试了$($x)等的一些组合,但我遗漏了一些细微之处:

  • "$str" - > "$(str)"
  • "$($str)" - > "$(foo)"

什么会映射到"foo"

感谢。

1 个答案:

答案 0 :(得分:5)

答案似乎是$(string(str))

以下版本对我有用,但需要进行一些调整才能达到:

a = [:foo, :bar]
b = [:printfoo, :printbar]
for (str, fn) in zip(a,b)
  @eval begin
    $fn() = println($(string(str)))
    @doc $("```\n$fn()\n```\nPrints $str.\n") $fn
  end
end

OP代码的一个问题是函数体在执行期间插入变量 - 这会导致printfoo烦恼地打印bar