Feltételes végrehajtás


Végrehajtási tömb:

{} között felsorolt objektumok sorozata (eljárás), az interpreter nem hajtja azonnal végre, hanem a sorozat tagjaiból egy végrehajtási tömb (eljárás) objektumot állít elõ és a müveleti verembe rakja, csak a híváskor hajtódik végre.

pl.:
86 23 add  109
azonnal végrehajtódik

{86 23 add} {86 23 add}
a verembe krül

/p1 {86 23 add} def,
4 {starside} repeat


Összehasonlítások:

x1 x2 eq bool
a verem két legfelsõ elemét összehasonlítja, ha egyenlõek, akkor TRUE értéket ír a verembe, különben FALSE-t ( elv: a két objektum egyenlõ, ha típusuk és értékük azonos)

pl.:

4.0 4 eq   true
valós és egész lehet azonos,

(abc)(abc) eq  true
hosszuk és elemeik azonosak

(abc)/abc eq  true
szöveg és név lehet azonos

x1 x2 ne bool    <>
x1 x2 gt bool     >
x1 x2 lt bool     <
x1 x2 ge bool    >=
x1 x2 le bool    <=



Az IF operátor:

bool proc if -

kiveszi a végrehajtási tömböt és a logikai objektumot a verembõl és végrehajtja a proc-ot, ha bool igaz (true). Pl.: eljárás, amely ellenõrzi, hogy a kurrens sor végére értünk-e (612 hosszú). Ha igen, akkor a köv. sor elejére ugrik:

/chkforendofline
{currentpoint pop
612 gt
{0-12 translate 0 0 moveto} if
} def

példa:

3 4 lt{(3 kisebb mint 4)}if (3 kisebb mint 4)


Szöveg kiíratása:



% Variables:

/LM 72 def
/RM 216 def
/ypos 720 def
/lineheight 14 def

% Procedures:

/newline {
ypos lineheight sub
/ypos exch def
LM ypos moveto
} def

/prtstr {
dup stringwidth pop
currentpoint pop
add RM gt
{newline} if
show
} def

% Main Program:

/Times-Italic findfont 13 scalefont setfont

LM ypos moveto
(If) prtstr (you) prtstr (tell) prtstr
(the) prtstr (truth,) prtstr (you) prtstr
(don't) prtstr (have) prtstr (to) prtstr
(remember) prtstr (anything.) prtstr
(- Mark) prtstr (Twain) prtstr

showpage



Az IFELSE operátor:

bool proc1 proc2 ifelse -

kiveszi mindhárom operandust a verembõl, proc1-et hajtja végre, ha bool igaz, különben proc2-t.

példa:

4 3 lt {(igaz)}{(hamis)} ifelse  (hamis)
 

Trapézok



/scalefactor 1 def

/counter 0 def

/DecreaseScale {
scalefactor .2 sub
/scalefactor exch def
} def

/IncreaseCounter {
/counter counter 1 add def
} def

/trappath {
0 0 moveto
90 0 rlineto
-20 45 rlineto
-50 0 rlineto
closepath
} def

/doATrap {
gsave
1 scalefactor scale
trappath
counter 2 mod
0 eq {1} {0} ifelse 0 1 setrgbcolor
fill
grestore
} def

%**** MAIN ****

250 350 translate

5 {
IncreaseCounter
doATrap
DecreaseScale
0 20 translate
} repeat

showpage



a lap teteje