LINUX.ORG.RU

[CL] Странная запись


0

0

Доброго времени суток!

Наткнулся в CLHS на такое:

(case test-key
{((key*) form*)}*)
==
(let ((#1=#:g0001 test-key))
(cond {((member #1# '(key*)) form*)}*))

Кто знает что в этом куске выражение "#1=#:g0001"? Получал подобное от SLIME и вот теперь интересно разобраться.

Заранее спасибо.

★★★★★

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

#1= помечает следующий объект, а #1# подставляет помеченный объект (при этом, подставленный объект будет равен помеченному с точностью до eq).

mo3r
()
Ответ на: комментарий от mo3r

Для примера:

#1= '(123 #1#)

Прочтется в бесконечный список.

Пример с разделяемыми (shared) частями структур:

CL-USER> *print-circle*
NIL
CL-USER> (let ((x (list 1 2)))
           (list x x))
((1 2) (1 2))
CL-USER> (setf *print-circle* t)
T
CL-USER> (let ((x (list 1 2)))
           (list x x))
(#1=(1 2) #1#)
CL-USER> 

mo3r
()
Ответ на: комментарий от mo3r

Огромное спасибо за развернутый ответ!

Sectoid ★★★★★
() автор топика

> "#1=#:g0001"

#:g0001 это gensym

anonymous
()

* (defun next-x() (setq x (+ x 1)))
NEXT-X
; да-да, надо замыканием.

* (setq x 0)
0

* (list #1=(next-x) #1# #1# #1#)
(1 2 3 4)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.