2016-03-31 9 views
2

Ich habe Probleme beim Kombinieren von Ausdruck und String-Interpolation. Ich möchte so etwas wie dies zu tun:Kombinieren von String- und Ausdruckinterpolation

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

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

Meine gewünschte Ausgabe sind zwei Funktionen, eine, die aussehen könnte, wie getippt, wie

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

Stattdessen ich Ausdrücke erhalten, die wie folgt aussehen (wenn ich verwendet quote statt @eval begin):

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

ich verstehe nicht, warum mit der gleichen $x Syntax, Interpolation durchgeführt, wie ich nur wollen außerhalb der angegebenen Regionen ("..."). Ich habe einige Kombinationen von $($x) usw. versucht, aber einige der Feinheiten bin fehlt:

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

Was "foo" Karte würde?

Danke.

+0

Zusammenfassung der längeren Antwort unten: '$ (" $ str ")' –

Antwort

5

Die Antwort scheint zu sein $(string(str)).

Die folgende Version für mich gearbeitet, aber es dauerte einige Optimierungen zu erreichen:

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 

Ein Problem, mit dem OP-Code war, als die Funktionsrümpfe die Variable während der Ausführung interpoliert - diese printfoo bewirken würde annoyingly Drucken bar.

+0

Das ist großartig. Also versuche ich immer noch zu verstehen, was $ $ ("$ str") 'funktioniert, aber die anderen beiden" Versuche ", die ich am Ende notiere, scheitern. Irgendein Einblick dort? Danke noch einmal. –

+0

Der Operator '$' hat im Zitatkontext und im String-Literalkontext eine andere Bedeutung. Das äußere '$' steht im Zitatkontext, der Julia anweist, sofort den "dollared" Ausdruck auszuwerten. Der Ausdruck hier ist das String-Literal. Das interne '$' befindet sich im String-Kontext, der den Wert der 'str'-Variable ersetzt. Aber ich muss gestehen, Makro-Denken ist von höherer Komplexität als normaler Code. –