2013-02-13 5 views
3

Мне нужен способ создания имен узлов GraphViz из объектов CLOS таким образом, что каждый объект получает свой собственный узел, и если я изменю свои объекты и заново создаю Визуализация GraphViz, я получаю те же имена узлов для объектов, которые остаются (по сути) одинаковыми.Печать объекта как уникальной строки, возможно, используя ее адрес

Если я просто попробуйте напечатать мой объект, я получаю то, что почти хорошо (так как я никогда не переопределяю PRINT-OBJECT для моего класса):

CL-USER> (format nil "~A" *g*) 
"#<GREF {1002D22C81}>" 

Есть ли способ, чтобы получить только что 1002D22C81 части в виде строки ? Затем я мог бы создать имена узлов GraphViz, например N1002D22C81.

Или я должен обработать результат (format nil "~A" obj) в виде строки, захватив часть между {}?

ответ

8

Шестнадцатеричное число - это адрес объекта. Он может изменить после сбора мусора. Ваша реализация может обеспечить функцию, чтобы получить ее напрямую, но я не думаю, что вы должны ее использовать.

Что вы можете сделать, это добавить слот name к вашим объектам и автоматически инициализировать их, используя, скажем, gensym.

Если вы хотите, чтобы отслеживать все ваши объекты, вы можете даже intern имен в специальной упаковке и установить их symbol-value к объектам (остерегайтесь, что это будет сделать объекты невозвратных по GC, пока вы unintern их имена или не удалите их symbol-value, или delete the aforementioned special package).

PS. Вы можете получить адрес объекта, даже если вы переопределяете print-object - просто пройдете :identity t до print-unreadable-object.

PPS. Я уверен, вы знаете, что (format nil "~A" x) - это то же самое, что и (princ-to-string x).

+0

Это, вероятно, дешевле для создания хеш-таблицы, а затем использовать '(setf (узел gethash (узел имен) * node-table *)) (или что-то, что вызывается аксессуром и таблицей). – Vatine

+0

@Vatine: 'symbol-value' - это просто доступ к слоту; это определенно дешевле, чем поиск в хэш-таблице. – sds

+0

Символ интернинга не является дешёвым. И поиск символа по имени (a la 'find-symbol') не дешевле, чем поиск в хэш-таблице. – Vatine

 Смежные вопросы

  • Нет связанных вопросов^_^