Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[m4] substr()

3 réponses
Avatar
JKB
Bonsoir à tous,

Je corrige un bout de m4 en découvrant certaines fonctionnalités de
l'outil que je n'avais jamais utilisées (les fonctionnalités, pas
l'outil, ne me faites pas dire ce que je ne voudrais pas qu'on
entende ;-) )

En particulier, j'ai un truc bizarre mais qui doit s'expliquer avec
substr() :

define(`API', 08 cf $1 substr($1, `0', `1') 00)dnl

Si la macro API est appelée comme ceci : API(AZ), je ne vois pas
pourquoi le résultat est :

08 cf AZ $ 00

En d'autres termes, pourquoi le $1 dans substr n'est pas expansé.
Google n'a pas été mon ami sur ce coup-là. Une idée ?

Merci d'avance,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr

3 réponses

Avatar
Cyrille Lefevre
Le 19/03/2012 17:58, JKB a écrit :
Bonsoir à tous,

Je corrige un bout de m4 en découvrant certaines fonctionnalità ©s de
l'outil que je n'avais jamais utilisées (les fonctionnalités , pas
l'outil, ne me faites pas dire ce que je ne voudrais pas qu'on
entende ;-) )

En particulier, j'ai un truc bizarre mais qui doit s'expliquer avec
substr() :

define(`API', 08 cf $1 substr($1, `0', `1') 00)dnl

Si la macro API est appelée comme ceci : API(AZ), je ne vois pas
pourquoi le résultat est :

08 cf AZ $ 00

En d'autres termes, pourquoi le $1 dans substr n'est pas expansé.
Google n'a pas été mon ami sur ce coup-là. Une idé e ?



Bonjour,

je ne peux t'expliquer le pourquoi du comment, mais à coup d'essais
plus ou moins douteux, voici 2 solutions :

1/
define(`API', 08 cf $1 `ifelse($1,,,substr($1, 0, 1))' 00)dnl
API(AZ)

2/
define(`API', `ifelse($1,,,08 cf $1 substr($1, 0, 1) 00)')dnl
API(AZ)

indice : gg m4 define substr :-)

http://mbreen.com/m4.html#ignore_argless_macros

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Paul Gaborit
À (at) Mon, 19 Mar 2012 16:58:49 +0000 (UTC),
JKB écrivait (wrote):

Je corrige un bout de m4 en découvrant certaines fonctionnalités de
l'outil que je n'avais jamais utilisées (les fonctionnalités, pas
l'outil, ne me faites pas dire ce que je ne voudrais pas qu'on
entende ;-) )

En particulier, j'ai un truc bizarre mais qui doit s'expliquer avec
substr() :

define(`API', 08 cf $1 substr($1, `0', `1') 00)dnl

Si la macro API est appelée comme ceci : API(AZ), je ne vois pas
pourquoi le résultat est :

08 cf AZ $ 00

En d'autres termes, pourquoi le $1 dans substr n'est pas expansé.
Google n'a pas été mon ami sur ce coup-là. Une idée ?



C'est parce que m4 expande tout... même les arguments de define. Il faut
donc tout quoter :

define(`API', `08 cf $1 substr($1, `0', `1') 00')dnl
API(AZ)
# -> 08 cf AZ A 00

Ou en plus simple :

define(`API', `08 cf $1 substr($1, 0, 1) 00')dnl
API(AZ)
# -> 08 cf AZ A 00

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/&gt;
Avatar
JKB
Le Tue, 20 Mar 2012 07:55:22 +0100,
Paul Gaborit écrivait :

À (at) Mon, 19 Mar 2012 16:58:49 +0000 (UTC),
JKB écrivait (wrote):

Je corrige un bout de m4 en découvrant certaines fonctionnalités de
l'outil que je n'avais jamais utilisées (les fonctionnalités, pas
l'outil, ne me faites pas dire ce que je ne voudrais pas qu'on
entende ;-) )

En particulier, j'ai un truc bizarre mais qui doit s'expliquer avec
substr() :

define(`API', 08 cf $1 substr($1, `0', `1') 00)dnl

Si la macro API est appelée comme ceci : API(AZ), je ne vois pas
pourquoi le résultat est :

08 cf AZ $ 00

En d'autres termes, pourquoi le $1 dans substr n'est pas expansé.
Google n'a pas été mon ami sur ce coup-là. Une idée ?



C'est parce que m4 expande tout... même les arguments de define. Il faut
donc tout quoter :

define(`API', `08 cf $1 substr($1, `0', `1') 00')dnl
API(AZ)
# -> 08 cf AZ A 00

Ou en plus simple :

define(`API', `08 cf $1 substr($1, 0, 1) 00')dnl
API(AZ)
# -> 08 cf AZ A 00



Merci du tuyau, je viens d'apprendre quelque chose ;-)

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr