Составители:
Рубрика:
{6} function Make_Atom ( x : El ): H_list;
var p : H_list;
begin
if MaxAvail >= SizeOf ( S_expr ) then
begin New ( p );
Make_Atom := p;
p ^ . Tag := Atomic; p ^ . Atm := x;
end
else
begin WriteLn; WriteLn ( ' ! Исчерпана память ' ); Halt; end;
end { Make_Atom };
{7} function Get_El ( x : H_list ): El;
begin
if not Atom ( x ) then
begin WriteLn; WriteLn( ' ! Get_El ( not Atom ) ' ); Halt; end
else Get_El := x ^ . Atm;
end { Get_El };
{ } function Copy ( x : H_list ): H_list;
begin
if Null ( x ) then Copy := nil
else if Atom ( x ) then Copy := Make_Atom ( x ^.Atm )
else Copy := Cons ( Copy( Head( x ) ), Copy ( Tail( x ) ) );
end { Copy };
{ } procedure Destroy ( x : H_list );
begin
if not Null ( x ) then
begin
if not Atom ( x ) then
begin Destroy ( Head ( x ) ); Destroy ( Tail( x ) ); end;
Dispose ( x );
end;
end { Destroy };
Отметим, что предложенная функция Cons не формирует копий исходных
S – выражений, а только создает экземпляр записи типа S_expr (вариант Pair )
и записывает ссылки на "голову" и "хвост" конструируемого S – выражения в
поля Hd и Tl этого экземпляра соответственно. Программист, таким образом,
должен сам заботиться о копировании списочных структур, избегая побочного
эффекта от включения одних списков в другие в качестве фрагментов. Пояс-
ним сказанное на ранее рассмотренных в 1.6 примерах функций рекурсивной
обработки линейных списков. Вернемся еще раз к этим примерам и рассмот-
рим, как указанные функции могут быть реализованы применительно к иерар-
хическим спискам с использованием модуля HList.
28
{6} function Make_Atom ( x : El ): H_list;
var p : H_list;
begin
if MaxAvail >= SizeOf ( S_expr ) then
begin New ( p );
Make_Atom := p;
p ^ . Tag := Atomic; p ^ . Atm := x;
end
else
begin WriteLn; WriteLn ( ' ! Исчерпана память ' ); Halt; end;
end { Make_Atom };
{7} function Get_El ( x : H_list ): El;
begin
if not Atom ( x ) then
begin WriteLn; WriteLn( ' ! Get_El ( not Atom ) ' ); Halt; end
else Get_El := x ^ . Atm;
end { Get_El };
{ } function Copy ( x : H_list ): H_list;
begin
if Null ( x ) then Copy := nil
else if Atom ( x ) then Copy := Make_Atom ( x ^.Atm )
else Copy := Cons ( Copy( Head( x ) ), Copy ( Tail( x ) ) );
end { Copy };
{ } procedure Destroy ( x : H_list );
begin
if not Null ( x ) then
begin
if not Atom ( x ) then
begin Destroy ( Head ( x ) ); Destroy ( Tail( x ) ); end;
Dispose ( x );
end;
end { Destroy };
Отметим, что предложенная функция Cons не формирует копий исходных
S – выражений, а только создает экземпляр записи типа S_expr (вариант Pair )
и записывает ссылки на "голову" и "хвост" конструируемого S – выражения в
поля Hd и Tl этого экземпляра соответственно. Программист, таким образом,
должен сам заботиться о копировании списочных структур, избегая побочного
эффекта от включения одних списков в другие в качестве фрагментов. Пояс-
ним сказанное на ранее рассмотренных в 1.6 примерах функций рекурсивной
обработки линейных списков. Вернемся еще раз к этим примерам и рассмот-
рим, как указанные функции могут быть реализованы применительно к иерар-
хическим спискам с использованием модуля HList.
28
Страницы
- « первая
- ‹ предыдущая
- …
- 26
- 27
- 28
- 29
- 30
- …
- следующая ›
- последняя »
