Question

Existe-t-il un moyen d’utiliser (ab) l’API C-API de tcl pour «analyser» une chaîne, en effectuant tout le remplacement (y compris les sous-commandes entre crochets), mais en s’arrêtant avant d’évaluer la ligne de commande résultante?

Ce que j'essaie de faire est de créer une commande (en C, mais je vais envisager de faire un tcl-wrapper, s'il existe un moyen élégant de le faire ici) qui prend un bloc en tant que paramètre (c'est-à-dire curly). accolades-quoted-string). J'aimerais prendre ce bloc, le diviser et effectuer des substitutions de la même manière que s'il devait être exécuté, mais s'arrêter là et interpréter les lignes résultantes à la place.

J'ai envisagé de créer un espace de noms dans lequel tous les premiers mots valides sont définis en tant que commandes, mais cette liste est si vaste (et plutôt dynamique), de sorte 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 redéfinir sur ce qu'il était auparavant, quand J'ai terminé, ce qui me semble plutôt fragile. En plus de cela, je courrais le risque (risque assez faible, mais pas nul) d'entrer en collision avec une commande réelle. Je préférerais donc beaucoup ne pas utiliser la commande unknown .

Le plus proche que je puisse obtenir est Tcl_ParseCommand (et le reste de la famille), qui produit un arbre d’analyse syntaxique que je pourrais évaluer manuellement. Je suppose que je vais recourir à cette méthode s'il n'y a pas de meilleure solution, mais je la préférerais bien sûr, s'il y avait une manière «officielle».

Est-ce que je manque quelque chose?

Était-ce utile?

La solution

Jetez un coup d’œil à Tcl_SubstObj . C'est l'équivalent C de la commande [subst], ce qui semble être ce que vous recherchez.

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 recherchez:

> 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}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top