Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Reid G.C.Thinking in PostScript.1990.pdf
Скачиваний:
17
Добавлен:
23.08.2013
Размер:
846.44 Кб
Скачать

Proper Nesting of Redefinitions

It is important to redefine names carefully so that they can be nested reasonably. It is always good to use the load operator when you pick up the old definition of a name. This is much better than, say, looking up the name directly in systemdict. However, it is also useful to keep your own name (like /old_show) from clobbering itself if you install your procedures a second time. One good way to accomplish that is to push a special dictionary onto the dictionary stack, but to avoid giving it a name (or your name will conflict with itself the second time you install the procedure). Example 10.13 illustrates this technique by loading the existing value stored under the name show, storing it away under the name old_show.

Example 10.13: Using load to Get Previous Definitions

/old_show /show load def /show { %def

dup == flush old_show

} bind def

CONCLUDING THOUGHTS

Dictionaries are flexible and powerful. The main uses for them are as storage for items that you don’t want to leave on the operand stack and as a name lookup mechanism for scoping program execution or local variables. You have learned several ways to manipulate dictionaries, store and retrieve entries from dictionaries, and look at their contents. Dictionaries are not heavily used in most PostScript programs other than to store simple definitions, but they can be exploited for some interesting purposes when the need arises, as you have seen. In the next chapter, dictionaries are contrasted to arrays and various methods of creating and manipulating data are presented.

132

Chapter 10: USING DICTIONARIES

EXERCISES

1.What value is left on the operand stack after executing the following short program segment?

/variable 7 def 5 dict dup begin

/variable 9 def end

/variable dup load 3 1 roll get add

2.Replace the dictionary named LOCALDICT in the following procedure with an anonymous dictionary. (The dictionary itself should have no name, and the only instance of the dictionary object should be inside the procedure body.)

/LOCALDICT 12 dict def

/boxproc % Xloc Yloc Width Height boxproc - { %def

LOCALDICT begin /height exch def /width exch def /Y exch def

/X exch def X Y moveto

0 height rlineto width 0 rlineto

0 height neg rlineto closepath

fill

end

} bind def

3.Name three operators in the PostScript language that use the dictionary stack in some way.

4.Write a program that shows (with the == operator) the names of all the fonts stored in the dictionary called FontDirectory.

Chapter 10: USING DICTIONARIES

133

134

Chapter 10: USING DICTIONARIES