Macros @eval在@testset name参数中转义$

Macros @eval在@testset name参数中转义$,macros,julia,metaprogramming,Macros,Julia,Metaprogramming,我在一个文件中有几个@testsets,我想将它们的输出对齐。 起初看起来是这样的: Test Summary: | Pass Total short | 1 1 Test Summary: | Pass Total test with longer name | 1 1 Test Summary: | Pass Total short | 1 1 Test S

我在一个文件中有几个
@testset
s,我想将它们的输出对齐。
起初看起来是这样的:

Test Summary: | Pass  Total
short         |    1      1
Test Summary:         | Pass  Total
test with longer name |    1      1
Test Summary:         | Pass  Total
short                 |    1      1
Test Summary:         | Pass  Total
test with longer name |    1      1
@testset $(testName("some for test \$i")) for i in 9:11
    @test i > 0
end
我希望将
|
对齐,使其如下所示:

Test Summary: | Pass  Total
short         |    1      1
Test Summary:         | Pass  Total
test with longer name |    1      1
Test Summary:         | Pass  Total
short                 |    1      1
Test Summary:         | Pass  Total
test with longer name |    1      1
@testset $(testName("some for test \$i")) for i in 9:11
    @test i > 0
end
我尝试使用
@sprintf
使名称的长度相同,但是
@testset
宏需要一个字符串文本。因此,我使用
@eval
在名称中插入格式化字符串:

testName(name) = @sprintf("%-25s", name)

@eval begin

@testset $(testName("short")) begin
    @test true
end

@testset $(testName("test with longer name")) begin
    @test true
end

end # @eval
这为我提供了简单测试集所需的功能,但在使用
for
循环变量插入到名称中。
如果我添加这样的测试:

Test Summary: | Pass  Total
short         |    1      1
Test Summary:         | Pass  Total
test with longer name |    1      1
Test Summary:         | Pass  Total
short                 |    1      1
Test Summary:         | Pass  Total
test with longer name |    1      1
@testset $(testName("some for test \$i")) for i in 9:11
    @test i > 0
end
输出是

Test Summary:             | Pass  Total
short                     |    1      1
Test Summary:             | Pass  Total
test with longer name     |    1      1
Test Summary:             | Pass  Total
some for test $i          |    1      1
Test Summary:             | Pass  Total
some for test $i          |    1      1
Test Summary:             | Pass  Total
some for test $i          |    1      1
看起来eval宏以某种方式逃逸了
$
,它不再与
@testset
宏一起工作。
为什么它不起作用?我如何强制
$
在名称字符串文本中存在而不被替换?(关于如何对齐结果的建议也受欢迎)。

使用带插值的
字符串作为
@testset
宏的参数:

julia> @testset "$(testName("some for test $i"))" for i in 9:11
           @test i > 0
       end;
Test Summary:             | Pass  Total
some for test 9           |    1      1
Test Summary:             | Pass  Total
some for test 10          |    1      1
Test Summary:             | Pass  Total
some for test 11          |    1      1

使用带插值的
字符串作为
@testset
宏的参数:

julia> @testset "$(testName("some for test $i"))" for i in 9:11
           @test i > 0
       end;
Test Summary:             | Pass  Total
some for test 9           |    1      1
Test Summary:             | Pass  Total
some for test 10          |    1      1
Test Summary:             | Pass  Total
some for test 11          |    1      1