Newsgroup: it.comp.lang.c
Titolo: Preprocessore - piccolo quiz

[OT] >>>
Sono proprio curioso di vedere le vostre risposte.
L'atteggiamento di comp.lang.c mi ha veramente deluso.
Non c'è nessuno tra voi che programma in C per pura passione e che ha 
voglia di cimentarsi in qualcosa di un po' diverso?
Vabbe', lasciamo perdere...
<<< [OT]
Il quiz è molto semplice:
Come implementereste un dizionario statico con le macro?
Il problema è che quando il simbolo non viene trovato, il comportamento 
deve essere definito.
Per es. le righe
PL_FIND(MYDICT, CASA)
PL_FIND(MYDICT, AUTO)
PL_FIND(MYDICT, QUESTO_NON_E_NEL_DIZIONARIO)
PL_FIND(MYDICT, jhgjhguytuyhkgjhg)
PL_FIND(MYDICT, 3498fjkhdlkh34098jhf)
devono produrre
definizione_casa
definizione_auto
simbolo_non_trovato
simbolo_non_trovato
simbolo_non_trovato
La soluzione che ho trovato è piuttosto corta (il fulcro non ha più di 
tre righe).
Se non avete familiarità col preprocessore, allora, IMHO, non sfruttate 
appieno le potenzialità di uno strumento molto utile.
[OT] >>>
Sull'altro ng mi è stato detto che è un quiz STUPIDO (quindi dovrei 
esserlo anch'io, dato che lo ritengo intelligente).
Nessuno mi ha saputo dare una soluzione, però erano tutti d'accordo sul 
fatto che fosse idiota e "non mantenibile". Viva la gente umile, priva 
di pregiudizi e che giudica solo ciò che conosce a fondo.
E' così difficile capire che se propongo un quiz è solo per condividere 
con la comunità qualcosa che ritengo divertente e/o interessante?
Lo faccio sotto forma di quiz perché ciò che importa è la ricerca della 
soluzione, non la soluzione stessa.
<<< [OT]
Kiuhnm

 esserlo anch'io, dato che lo ritengo intelligente).
Non prendertela ... fedro nella fiaba la volpe e l'uva ha definito tutto 
ciò molto bene ... numdum matura est .... per quanto riguarda il quesito 
... io sono molto ritardato e ci sto pensando :)
[...]

 simbolo_non_trovato
Cosa vuoi dire con "devono produrre"?
L'espansione della macro "PL_FIND(MYDICT,CASA)" (per esempio) deve essere:
   1) l'identificatore definizione_casa
   2) la stringa "definizione_casa"
   3) una funzione che una volta eseguita stampi "definizione_casa"
   4) ...
R.

 [...]
Non è stato facile trovare la soluzione, per cui non ti scoraggiare.
Però hai un vantaggio: sai che la soluzione esiste.
Comunque ho avuto modo scoprire che pochissimi compilatori/preprocessori 
seguono lo standard adeguatamente. Purtroppo dobbiamo adeguarci e 
prenderlo come un semplice quiz per discutere magari sulle diversità tra 
i diversi compilatori. Sono sicuro al 99.9% che è possibile ottenere 
l'effetto voluto con ogni compilatore, con minime variazioni.
Dovresti trovare il mondo di ottenere il listato preprocessato in modo 
da poter vedere il risultato della sostituzione delle macro.
In questo modo è facile capire cosa non va. Se invece mandi il risultato 
al compilatore, questo ti risponderà con un errore astruso e difficile 
da interpretare.
Kiuhnm

   3) una funzione che una volta eseguita stampi "definizione_casa"
La 1.
La 3 è troppo banale ;)
Kiuhnm

Kiuhnm ha scritto:
[...]
Per chi fosse interessato, un piccolo aiuto:
#define IGNORE1(x,y)	y
o, più funzionale (C99),
#define IGNORE1(x,...)	__VA_ARGS__
ignorano il primo argomento.
Come può tornare utile?
Un simbolo non definito (cioè "non trovato") non verrebbe "espanso" o 
"ridotto" (a seconda delle scuole di pensiero :) ), ma se lo passassimo 
a IGNORE1 come primo parametro ce ne sbarazzeremmo, ma il problema è...
Kiuhnm

 a IGNORE1 come primo parametro ce ne sbarazzeremmo, ma il problema è...
Che dobbiamo capire se il simbolo è definito o no
Remo D.


Kiuhnm, non ho capito come intendi utilizzare che le macro di cui sopra.
Visto che nessun'altro ha risposto vedo due possibili alternative:
1) Ci illustri la tua tecnica in modo da renderci tutti piu' saggi
2) Non ci racconti nulla perdendo l'occasione di diffondere una tecnica 
potenzialmente utile.
Io punto sul numero 1.
Remo D.

 Io punto sul numero 1.
Anch'io, ma prima mi dici che compilatore C usi?
Kiuhnm