Вы не можете найти имя словаря PostScript, поскольку словари PostScript не имеют имен.
Когда вы связываете объект словаря с именем, вы создаете пару ключ / значение в другомтолковый словарь.Ключ - это имя, а значение - словарь.Если вы не укажете другой словарь для создания пары, то они будут созданы в текущем словаре.Если вы не вызвали 'begin', то userdict обычно является текущим словарем.
Так что если вы делаете что-то вроде:
/MyDict 10 dict def
То, что вы делаете, это создание объекта словаря и связываниеэто с именем / MyDict в текущем словаре.Когда вы позже выполните MyDict
Интерпретатор ищет текущий словарь, а затем все другие словари в стеке словарей в поисках ключа, который является именем / MyDict.Когда он находит этот ключ, он извлекает соответствующий словарь и помещает его в стек операнда (или словаря).
Имя никогда не связано со словарем, кроме как пара ключ / значениев другом словаре.
Учтите это:
/MyDict1 /MyDict2 10 dict dup def def
Это создает две пары ключ / значение в текущем словаре, одна имеет ключ / MyDict1, другая имеет ключ / MyDict2, но оба из этих ключей связаны с одним и тем же словарем.Итак, каким будет название словаря?
Обратите внимание, что составные объекты, такие как словари и массивы, обрабатываются как простые указатели в PostScript.Когда вы делаете dup
для составного объекта, он не создает новый массив или словарь и копирует все содержимое оригинала (плюс все содержимое любых составных объектов в оригинале), он просто толкает другой указатель на тот жеуже выделенный объект.
Если вы хотите, чтобы ваши словари содержали имя, тогда вам нужно сохранить пару ключ / значение внутри словаря.Например:
<<
/Name /MyDict1
>>
или что-то похожее.
Существуют специальные словари, которые всегда находятся в стеке словарей и не могут быть удалены;systemdict, globaldict и userdict (в некоторых реализациях их может быть больше).
[Позже подумает] Можно, конечно, написать программу PostScript, которая при наличии словаря проверяет все словари в userdict, systemdict и globaldict на соответствиетекущий словарь, чтобы узнать, являются ли они eq
, используя forall и проверяя тип значения 'dict'.Таким образом, у вас будет ассоциированное имя в качестве другого параметра.
Очевидно, что, сделав процедуру проверки рекурсивной (т. Е. Если это не тот словарь, который нам нужен, проверьте все словари в этом словаре), вы бы затембыть в состоянии проверить все доступное в настоящее время дерево словарей, чтобы увидеть, являются ли они словарем, для которого вы хотите связать имя.
Вы можете выйти из цикла и рекурсии, как только найдено совпадение, или продолжитьпроверка каждого доступного словаря, чтобы увидеть, есть ли на него ссылки в другом месте.