[successivo] [precedente] [inizio] [fine] [indice generale]


Sezione 16.   Macro

Pic offre la possibilità di definire delle macro. La cosa può tornar utile per descrivere diagrammi ripetitivi. Assieme ale regole di visibilità per i blocchi composti (sezione 13.2) consente effettivamente di scrivere delle funzioni (vedi ad esempio il listato 16.1).

La sintassi è la seguente:

define nome_macro separatore corpo_macro separatore

In questo modo si definisce nome_macro come una macro che poi verrà sostituita dal testo in corpo_macro (separatori esclusi).(1) La macro può essere invocata come segue:

nome_macro(primo_argomento, secondo_primo_argomento, ...)

Gli (eventuali) argomenti vengono sostituiti al posto degli elementi sintattici $1, $2, ... $n che appaiono nel corpo della macro.

Come esempio di utilizzo delle macro, si considerino il listato 16.1 e la figura 16.2.

Listato 16.1. Esempio di utilizzo delle macro.

.PS
# Traccia un microinterruttore in un riquadro,
# $1 rappresenta lo stato (acceso/spento).
define jumper { [
    shrinkfactor = 0.8;
    Outer: box invis wid 0.45 ht 1;


    # Grazie al ] finale le seguenti variabili verranno
    # poi reimpostate automaticamente
    boxwid = Outer.wid * shrinkfactor / 2;
    boxht  = Outer.ht  * shrinkfactor / 2;


    box fill (!$1) with .s at center of Outer;
    box fill ($1)  with .n at center of Outer;
] }


# Traccia un blocco di sei microinterruttori
define jumperblock { [
    right;

    jumper($1);
    jumper($2);
    jumper($3);
    jumper($4);
    jumper($5);
    jumper($6);


    jwidth  = last [].Outer.wid;
    jheight = last [].Outer.ht;


    box with .nw at 6th last [].nw wid 6*jwidth ht jheight;


    "Stato dei microinterruttori: $1$2$3$4$5$6" at last box .s + (0, -0.2);
] }


# Esempio di invocazione macro.
A: jumperblock(1,1,0,0,1,0);
move right 2 then down 1;
B: jumperblock(1,0,1,0,1,1);
spline -> from A.right down right 1 then down left 2 to B.left
.PE

Figura 16.2. Esempio di utilizzo delle macro.

Esempio di utilizzo delle macro

Un dettaglio che l'esempio del listato 16.1 non illustra è che il passaggio dei parametri alle macro non comporta la separazione delle stringhe: chiamando jumper( 1 ), il valore di $1 sarà 1; chiamando jumper(stringa lunga) $1 varrà stringa lunga.

Se si intende passare come parametro una coppia ordinata, per evitare conflitti con il simbolo di separazione degli argomenti è possibile avvolgere la coppia fra parentesi.

La definizione di una macro è persistente da una figura all'altra. Per annullare una definizione si scriva:

undef nome_macro;

per esempio, il codice del listato 16.3 annulla le due macro definite nel listato 16.1.

Listato 16.3.

...
undef jumper
undef jumperblock
...

Informatica per sopravvivere 2006.01.30 --- Copyright © 2004-2006 Massimo Piai -- <pxam67 (ad) virgilio·it>


1) separatore può essere qualunque carattere che non compaia in corpo_macro, oppure la coppia separatore/separatore può essere costituita da una coppia bilanciata di parentesi graffe ({ e }), e (in ogni caso) corpo_macro può contenere coppie bilanciate di parentesi graffe.


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome macro.html

[successivo] [precedente] [inizio] [fine] [indice generale]

Valid ISO-HTML!

CSS validator!