2016-03-31 11 views
2

式と文字列補間の組み合わせに問題があります。私はこのような何かやりたい:文字列と式の補間を組み合わせる

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") 

のように、見えるかもしれない二つの機能、1です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

下記の返事の要約: '$(" $ str ")' –

答えて

5

答えは$(string(str))のようです。

次のバージョンは、私のために働いたが、それが到着するいくつかの調整をした:関数の本体は、実行時に変数を補間するときOPコードと

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 

一つの問題は、だった - これはうるさくへprintfooを引き起こします印刷bar

+0

これは素晴らしいことです。だから私は '$(" $ str ")'を動作させるものを理解しようとしていますが、最後にもう一度試みる "試み"は失敗します。そこにどんな洞察?再度、感謝します。 –

+0

'$'演算子は、引用コンテキストと文字列リテラルコンテキストでは異なる意味を持ちます。外側の '$'は引用文脈の中にあり、Juliaに "人形付き"表現を直ちに評価するよう指示します。ここの表現は文字列リテラルです。内部の '$'は文字列コンテキスト内にあり、 'str'変数の値を置き換えます。しかし、私は、マクロの思考は通常のコードよりも複雑です。 –

関連する問題