我在组合表达式和字符串插值方面遇到了麻烦。我想做这样的事情:
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"
?
感谢。
答案 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
。