2012-04-11 6 views
2

Was ich tun will, ist ein Argument zu einem tcl proc als String ohne Auswertung zu analysieren. Zum Beispiel, wenn ich hatte eine triviale proc, das es gerade die Argumente druckt:Getauschte tcl Argumente

proc test { args } { 
    puts "the args are $args" 
} 

Was ich möchte es mit dem tun nennen ist:

test [list [expr 1+1] [expr 2+2]] 

und nicht tcl bewerten haben die [list [expr 1+1] [expr 2+2]]. Oder selbst wenn es ausgewertet würde ich immer noch die ursprüngliche Befehlszeile haben. So mit dem trivialen „test“ proc oben Ich möchte zurückkehren können:

the args are [list [expr 1+1] [expr 2+2]]

Ist das möglich in tcl 8.4?

Antwort

3

Sie nicht tut dies mit Tcl 8.4 (und vor); Das Sprachdesign macht dies unmöglich. Die Lösung besteht darin, Argumente unausgewertet (und in geschweifte Klammern eingeschlossen) zu übergeben. Sie können sie dann drucken, wie Sie möchten. Um ihr ausgewertetes Formular zu erhalten, müssen Sie dies in Ihrem Verfahren tun:

Das ist mehr als ein bisschen chaotisch!


Wenn Sie 8,5 Tcl verwendet haben, können Sie eine weitere Alternative haben würde:

set calling_code [dict get [info frame -1] cmd] 

Die info frame -1 bekommt ein Wörterbuch eine Beschreibung des aktuellen Befehls im Kontext hält, die das derzeitige Verfahren genannt, und Der Schlüssel cmd ist die tatsächliche Befehlszeichenfolge, bevor die Ersetzungsregeln angewendet werden. Das sollte über das sein, was Sie wollen (obwohl Sie wissen, dass es den Befehlsnamen selbst enthält).

Dies ist nicht verfügbar für 8.4, noch wird jemals zurückportiert werden. Vielleicht möchten Sie upgraden!

+0

Vielen Dank. Das habe ich befürchtet. – user1327792

+0

Der Grund, warum ich mir ziemlich sicher bin, dass 'Info Frame' nie auf 8.4 zurückportiert wird, ist, dass es eine Menge aufdringlicher Maschinerie benötigt hat, um es zu implementieren; Es hat der Implementierung von Tcl in Bereichen, die bereits sehr kompliziert waren, viel Komplexität hinzugefügt. Ein Backport würde enorm stören. –

1

Beim Passieren der Argumente in Test, enclose them in braces, zB: Test {[Liste [ausdr 1 + 1] [ausdr 2 + 2]]}

+0

Danke. Aber ich habe vergessen zu erwähnen, dass die Argumentliste an mich übergeben wurde und ich den Arg nicht bearbeiten kann, um die Klammern hinzuzufügen. – user1327792