Составители:
Рубрика:
{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
- …
- следующая ›
- последняя »