2009-10-21 3 views
0

Existe-t-il un moyen de (ab) utiliser l'API Ccl pour «analyser» une chaîne, effectuer tous les remplacements (y compris les sous-commandes entre crochets), mais arrêter avant d'évaluer réellement la commande résultante ligne? Ce que j'essaye de faire est de créer une commande (en C, mais je considérerai faire un tcl-wrapper, s'il y a une manière élégante de le faire là) qui prend un bloc comme paramètre (c.-à-d. Bouclé) -braces-quoted-string). Je voudrais prendre ce bloc, le diviser et effectuer des substitutions de la même manière que s'il devait être exécuté, mais arrêter là et interpréter les lignes résultantes à la place. J'ai envisagé de créer un espace de noms, où tous les premiers mots valides sont définis comme des commandes, mais cette liste est si vaste (et assez dynamique) qu'elle devient rapidement trop lourde. J'ai également essayé cette approche mais avec la commande unknown pour intercepter les différentes commandes. Cependant, unknown est utilisé pour un tas de choses, et ne peut pas être lié à un espace de noms, je devrais donc le définir chaque fois que j'exécute le bloc, et le remettre à ce qu'il était avant quand j'ai fini, ce qui assez fragile. En plus de cela, je courrais le risque (risque assez faible, mais non nul) de collision avec une commande réelle, donc je préférerais de beaucoup ne pas utiliser la commande unknown.Substitution de chaîne utilisant tcl API

Le plus proche que je peux obtenir est Tcl_ParseCommand (et le reste de la famille), ce qui produit un arbre d'analyse, que je pourrais évaluer manuellement. J'imagine que je vais essayer de le faire de cette façon s'il n'y a pas de meilleure solution, mais je préférerais bien sûr qu'il y ait un moyen «officiel».

Ai-je raté quelque chose?

Répondre

2

Jetez un oeil à Tcl_SubstObj. C'est l'équivalent C de la commande [subst], qui semble être ce que vous cherchez.

Comme vous l'avez indiqué dans votre commentaire, subst ne fait pas tout à fait ce que vous cherchez à faire. Si cela vous aide, le code Tcl suivant peut être ce que vous cherchez:

> 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} 
+0

Bonne suggestion, le seul problème est qu'il ne tiendra pas compte des accolades, je verrai si je peux en faire l'utilisation de cela ... – falstro

+0

c'est une utilisation créative de uplevel .. :) C'est équivalent à eval [concat list $ mydata], bonne idée cependant, merci! – falstro

+0

Le code à l'intérieur du proc est équivalent. Le proc lui-même utilise uplevel spécifiquement pour s'assurer que la substitution de code/variable se produit au niveau de la pile à partir de laquelle il a été appelé. Vous ne pouvez pas utiliser [eval [concat ...]] dans ma proc et obtenir les mêmes résultats. – RHSeeger

Questions connexes