Piszę program rakietowy, który szeroko wykorzystuje zestawy. Patrząc na wynik programu, kilka zestawów zawiera # 0 # jako ich jedyną część danych. Co to powoduje?Dlaczego zestaw (lub lista) w Racket drukuje z # 0 # jako jedyną częścią danych?
Odpowiedz
#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.