Как вы видите название словаря PostScript? - PullRequest
2 голосов
/ 09 июля 2019

Как мне найти НАЗВАНИЯ словарей PostScript?

Просмотр словаря PostScript просто помещает -dict- в стек.Да, содержимое легко просмотреть с помощью {== ==}.Да, имя образца содержимого можно найти с помощью {== exit} forall Да, количество сохраненных элементов можно легко найти.

И, да, общее содержимое всех словарей можно найти с помощью чего-либопохоже на https://www.tinaja.com/psutils/snoop2a.psl КОГДА и ЕСЛИ вы знаете их имена раньше времени.

Но как НАПРЯМУЮ найти имя текущего словаря?

Ожидаемое: объект имени, подобный/ UserDict

1 Ответ

0 голосов
/ 10 июля 2019

Вы не можете найти имя словаря 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'.Таким образом, у вас будет ассоциированное имя в качестве другого параметра.

Очевидно, что, сделав процедуру проверки рекурсивной (т. Е. Если это не тот словарь, который нам нужен, проверьте все словари в этом словаре), вы бы затембыть в состоянии проверить все доступное в настоящее время дерево словарей, чтобы увидеть, являются ли они словарем, для которого вы хотите связать имя.

Вы можете выйти из цикла и рекурсии, как только найдено совпадение, или продолжитьпроверка каждого доступного словаря, чтобы увидеть, есть ли на него ссылки в другом месте.

...