结合字符串和表达式插值

Mic*_*ith 2 julia

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

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

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

我想要的输出是两个函数,一个可能看起来像打字一样

"""    
```
printfoo()
```
Prints foo.
"""
printfoo() = println("foo")
Run Code Online (Sandbox Code Playgroud)

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

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

我不明白为什么使用相同的$x语法,插入被执行,因为我只想在quoted("...")区域之外.我尝试了一些$($x)等等的组合但是我错过了一些细微之处:

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

会映射到"foo"什么?

谢谢.

Dan*_*etz 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
Run Code Online (Sandbox Code Playgroud)

OP代码的一个问题是当函数体在执行期间插入变量时 - 这将导致printfoo烦人的打印bar.