Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Interprétation de {

2 views
Skip to first unread message

User

unread,
Sep 3, 2009, 7:24:47 PM9/3/09
to
Bonjour,

Si je fais
set toto "{!"
set long [llength $toto]

J'obtiens un message d'erreur car il m'interpr�te le {

Comment faire sans le remplacer pas un autre caract�re?
Y aurait il une option � mettre ou quelque chose comme �a?

Merci d'avance.

Kroc

unread,
Sep 4, 2009, 6:36:40 AM9/4/09
to
On 4 sep, 01:24, User <u...@user.invalid> wrote:
> Bonjour,
>
> Si je fais
> set toto "{!"
> set long [llength $toto]

llength c'est le nombre d'éléments dans une liste, ça ne serait pas
plutôt string length $toto qui t'intéresserait ?

% set toto "{!"
% set long [string length $toto]
2

--
David Zolli

User

unread,
Sep 6, 2009, 5:46:57 PM9/6/09
to
En faite j'ai r�duit le probl�me au minimum.

C'est plut�t du style :

set toto "titi tata {! blabla"
set long [llength $toto]


J'ai plusieurs �l�ments dans la liste, c'est pourquoi j'utilise llength.
La liste est remplit de fa�ons al�atoire.

D�s que les �l�ment comportent des trucs style { ou . tcl me les
interpr�te et fais planter

Kroc a �crit :


> On 4 sep, 01:24, User <u...@user.invalid> wrote:
>
>> Bonjour,
>>
>> Si je fais
>> set toto "{!"
>> set long [llength $toto]
>>
>

> llength c'est le nombre d'�l�ments dans une liste, �a ne serait pas
> plut�t string length $toto qui t'int�resserait ?

Francois Vogel

unread,
Sep 6, 2009, 6:56:12 PM9/6/09
to
Bonjour,

User said on 06/09/2009 23:46:


> set toto "titi tata {! blabla"
> set long [llength $toto]
>

> D�s que les �l�ment comportent des trucs style { ou . tcl me les
> interpr�te et fais planter

set long [llength [split $toto]]

me para�t convenir � premi�re vue.

HTH
Francois

Newmagic

unread,
Sep 7, 2009, 3:54:09 AM9/7/09
to
On 6 sep, 23:46, User <u...@user.invalid> wrote:
> En faite j'ai réduit le problème au minimum.
>
> C'est plutôt du style :

>
> set toto "titi tata {! blabla"
> set long [llength $toto]
>
> J'ai plusieurs éléments dans la liste, c'est pourquoi j'utilise llength.
> La liste est remplit de façons aléatoire.
>
> Dès que les élément comportent des trucs style { ou . tcl me les
> interprète et fais planter
>
> Kroc a écrit :

>
> > On 4 sep, 01:24, User <u...@user.invalid> wrote:
>
> >> Bonjour,
>
> >> Si je fais
> >> set toto "{!"
> >> set long [llength $toto]
>
> > llength c'est le nombre d'éléments dans une liste, ça ne serait pas
> > plutôt string length $toto qui t'intéresserait ?

>
> > % set toto "{!"
> > % set long [string length $toto]
> > 2
>
> > --
> > David Zolli

Ou bien backslasher les caractères { } [ ] " et .
Newmagic

Aric

unread,
Sep 10, 2009, 5:18:33 AM9/10/09
to
On 6 sep, 15:46, User <u...@user.invalid> wrote:
> En faite j'ai réduit le problème au minimum.
>
> C'est plutôt du style :

>
> set toto "titi tata {! blabla"
> set long [llength $toto]
>
> J'ai plusieurs éléments dans la liste, c'est pourquoi j'utilise llength.
> La liste est remplit de façons aléatoire.
>
> Dès que les élément comportent des trucs style { ou . tcl me les
> interprète et fais planter
>

Le problème vient du fait que tu ne fais pas la distinction entre une
chaîne et une liste. Quoique chaque liste soit une chaîne (ou plus
précisément, que chaque liste ait une représentation chaîne valide),
il existe des chaînes qui ne sont pas des listes valides, comme tu l'a
découvert. Il est important de ne jamais présumer qu'une chaîne soit
une liste valide. Si tu construis ta valuer avec des commandes qui
font des listes ([list], [lappend], etc.), il n'y a aucun problème.
Sinon, depuis 8.5 (si je ne me trompe pas) il existe la commande
[string is list] qui pourrait t'être utile. S'il faut faire une
conversion, la méthode à utiliser dépend des circonstances; [split] et
[regexp -all -inline] sont deux options, et il doit y en avoir
d'autres.

Cordialement,
Aric

hubert

unread,
Sep 25, 2009, 9:40:59 AM9/25/09
to
Bonjour à tous
pour rajouter de la confusion, voici ce que j'ai essayé

#############################
% set toto \{
{
% lappend toto titi
unmatched open brace in list

Le backslash neutralise l'accolade et toto est donc une chaine de
caractère constituée uniquement de {
On ne peut pas construire de liste.
###############################
% set toto titi
titi
% lappend toto \{
titi \{
la chaine de caractère toto est bien constituée de titi et de \{
de plus lappend est une commande pour manipuler des listes donc toto
est bien une liste valide

%lindex $toto 1
{
Là c'est bizarre, car le backslash est ignoré
% lappend toto a
unmatched open brace in list
et on retombe sur une tentative de créer une liste titi { ce qui est
impossible.
###########################

A+

Hubert

Newmagic

unread,
Sep 25, 2009, 10:25:08 AM9/25/09
to

Bonjour,

Je pense que le phénomène que vous décrivez ici représente les limites
de la normalisation des listes en Tcl/Tk. En effet, comme "tout est
chaîne de caractère", représenter une liste sous forme de chaîne de
caractères entraîne obligatoirement l'utilisation de caractères
spécifiques de séparation qui ne peuvent être inclus dans l'un des
éléments de la liste elle-même, à moins d'être backslashés.
Or, l'interprétation d'un tel élément (pour un affichage ou dans le
corps d'une méthode comme lappend, apparemment) entraîne la
"disparition" du backslash, ce qui débouche sur des erreurs du type de
celles rencontrées dans votre exemple.
Mais je peux me tromper...

Newmagic

Proust Michel

unread,
Sep 28, 2009, 4:45:05 AM9/28/09
to
"hubert" <hubert...@univ-rouen.fr> a �crit dans le message de news:
edd8c4fe-43e7-41d7...@h30g2000vbr.googlegroups.com...
Bonjour � tous
pour rajouter de la confusion, voici ce que j'ai essay�

#############################
% set toto \{
{
% lappend toto titi
unmatched open brace in list

Le backslash neutralise l'accolade et toto est donc une chaine de

caract�re constitu�e uniquement de {


On ne peut pas construire de liste.
###############################
% set toto titi
titi
% lappend toto \{
titi \{

la chaine de caract�re toto est bien constitu�e de titi et de \{


de plus lappend est une commande pour manipuler des listes donc toto
est bien une liste valide

%lindex $toto 1
{
L� c'est bizarre, car le backslash est ignor�


% lappend toto a
unmatched open brace in list

et on retombe sur une tentative de cr�er une liste titi { ce qui est
impossible.
###########################

A+

Hubert

en faisant comme �a c'est OK
1% set toto titi
titi
2% lappend toto \\{
titi {\{}
3% lindex $toto 1
\{
4% lappend toto a
titi {\{} a
5%
bonne journ�e Michel


Eric Hassold

unread,
Sep 28, 2009, 10:35:23 AM9/28/09
to
Bonjour,


Proust Michel a �crit :

> % set toto titi
> titi
> % lappend toto \{
> titi \{
> la chaine de caract�re toto est bien constitu�e de titi et de \{
> de plus lappend est une commande pour manipuler des listes donc toto
> est bien une liste valide

Petite tentative pedagogique, en suggerant de bien faire la distinction
entre ce qui est "parse", ce qui est represente en interne dans l'objet
Tcl, et ce qui est affiche. La chronologie est importante.

Quand vous ecrivez
% lappend toto \{
c'est le parser qui traite le backslash pour echapper le caractere
suivant "{". La fonction lappend recoit donc deux argument, le nom de la
liste "toto" et la chaine de 1 caractere "{". Il n'y a plus de
"backslash" ici. Le resultat est donc une liste de deux elements, le
premier "titi", le deuxieme "{" (chaine de 1 caractere).

Vient alors le moment de retourner le resultat pour l'afficher.
L'interprete doit alors generer alors une representation sous forme de
chaine de la liste en question (tout en conservant en memoire que cet
objet est une liste). Et c'est lui qui ajoute un backslash pour
l'affichage, car sinon la chaine "titi {" ne serait pas la forme
serialisee de la liste. Ce backslash n'est pas celui que vous avez saisi
en entree et qui aurait ete propage, juste un autre requis pour
l'affichage. Pour illustrer cela, vous pouvez tester:

% set toto titi
titi
% lappend toto "{"
titi \{

Aucun backslash en entree, mais l'afficheur doit en mettre un pour
representer sous forme de chaine le contenu de la liste.

> %lindex $toto 1
> {
> L� c'est bizarre, car le backslash est ignor�

J'espere que vous voyez donc maintenant que ceci n'est pas bizarre. Le
deuxieme element de la liste toto est bien la chaine de 1 caractere "{".
Et l'afficheur, a qui il est demande d'afficher la forme serialisee
d'une chaine, n'a rien a faire si ce n'est l'afficher, sans autre
precaution. Dans le meme genre, vous pouvez faire:

% set toto [list titi "hello world"]
titi {hello world}
% lindex toto 1
hello world

> % lappend toto a
> unmatched open brace in list
> et on retombe sur une tentative de cr�er une liste titi { ce qui est
> impossible.

La, vous avez du faire une erreur de frappe ou qqchose qui n'est pas
dans votre session, car ca ne pose pas de probleme:

% set toto titi
titi
% lappend toto \{
titi \{

% lappend toto a
titi \{ a

Eric

0 new messages