Feltételes végrehajtás
86 23 add 109
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.:
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 azonosx1 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:
4 3 lt {(igaz)}{(hamis)} ifelse (hamis)
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:
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
} repeatshowpage