2016-08-22 69 views

Odpowiedz

5

#0# jest używany w drukarce rakietowej do opisywania cyclic data structures lub obiektów z pamięcią wspólną. Zasadniczo, sposób działania polega na tym, że istnieje obiekt oznaczony, powiedzmy, #0=, a następnie, gdy widzisz, #0# odnosi się do tego obiektu.

Tak na przykład:

#0=(1 . #0#) 

jest lista nieskończonej długości zawierający tylko 1 s. Dzieje się tak, ponieważ utworzona struktura danych to tylko para wad, gdzie pierwszy element to 1, a drugi element wskazuje na siebie.

Możesz mieć dowolną ich liczbę, aby tworzyć bardziej złożone struktury wykresów. Takich jak:

#0=(#1=(1 . #0#) . #1#) 

Wreszcie, nie trzeba mieć cyklicznej struktury danych w ogóle. Powiedzmy X by³ następujące struktury danych:

'(#0=#&42 . #0#) 

(wehre #& oznacza pole zmienny) mutacje elementu w pierwszym elemencie z pary będzie dodatkowo zmutować element drugiej części pary. Więc jeśli para ta została powołana do zmiennej x, a następnie:

> x 
'(#0=#&42 . #0#) 
> (set-box! (car x) 43) 
> (car x) 
'#&43 
> (cdr x) 
'#&43 
> x 
'(#0=#&43 . #0#) 

Normalnie nie można napisać to bezpośrednio w kodzie bezpośrednio w kodzie, ale jest możliwe do skonstruowania go za pomocą read.

> (define x (read) 
#0=(1 . #0#) 
> x 
#0='(1 . #0#) 
> (car x) 
1 
> (cadr x) 
1 
> (cdr x) 
#0=1(1 . #0#) 

Można również zmodyfikować czytelnikowi tylko pozwalają umieścić go w kodzie bezpośrednio z read-accept-graph podczas czytania w kodzie źródłowym modułu.