Frage

Gibt es eine Möglichkeit zu (ab) verwenden, um die tcl C-API zu ‚Parse‘ eine Zeichenfolge, tun alle Ersatz (einschließlich Sub-Befehle in eckigen Klammern), aber zu stoppen, bevor die resultierende Befehlszeile tatsächlich Auswertung?

Was ich versuche, einen Befehl zu tun ist, erstellen (in C, aber ich werde einen tcl-Wrapper in Erwägung ziehen, wenn es eine elegante Art und Weise ist es dort zu tun), die einen Block als Parameter (dh curly- Zahnspangen-quoted-string). Ich möchte diesen Block nehmen, teilen Sie es auf und Ersetzungen in der gleichen Art und Weise durchführen, als ob sie ausgeführt war, aber dort anhalten und interpretieren, die sich daraus ergebenden Linien statt.

Ich habe als einen Namensraum zu schaffen, in dem alle gültigen ersten Worten als Befehle definiert werden, aber diese Liste so groß ist (und so ziemlich dynamisch), so wird es schnell zu umständlich. Ich habe auch versucht, diesen Ansatz aber mit dem unknown Befehl die verschiedenen Befehle abzufangen. Allerdings unknown ist für ein paar Sachen verwendet, und nicht zu einem Namensraum gebunden werden kann, so würde ich es definieren, wann immer ich den Block ausführen, und legen Sie es zurück zu, was auch immer es war, bevor, wenn ich fertig bin, was fühlt ziemlich wackelig. Hinzu kommt, dass würde ich das Risiko (ziemlich geringes Risiko, aber nicht Null) der Kollision mit einem tatsächlichen Befehl ausführen, also würde ich sehr viel lieber nicht den unknown Befehl verwenden.

Der nächstgelegene ich bekommen kann, ist Tcl_ParseCommand (und der Rest der Familie), die einen Parse-Baum erzeugt, die ich manuell auswerten konnte. Ich glaube, ich es auf diese Weise zu tun greifen würde, wenn es keine bessere Lösung ist, aber ich würde es natürlich lieber, wenn es ein ‚offizieller‘ Weg ist ..

Bin ich etwas fehlt?

War es hilfreich?

Lösung

Hier finden Sie aktuelle Tcl_SubstObj . Es ist das C-Äquivalent des [subst] Befehl, der zu sein scheint, was Sie suchen.

Wie Sie in Ihrem Kommentar angezeigt, ist subst nicht ganz tun, was Sie suchen zu tun. Wenn es hilft, kann der folgende Tcl-Code sein, was Sie suchen:

> set mydata {mylist item $listitem group item {$group item}}
> set listitem {1 2 3}
> subst $mydata      ;# error: can't read "group": no such variable
> proc groupsubst {data} {
    return [uplevel 1 list $data]
}
> groupsubst $mydata ;# mylist item {1 2 3} group item {$group item}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top