Вы здесь

14. Ключи в процедурах

 

Ключи в процедурах

В объявление процедуры можно включить ключевые слова, вводимые словом

 options opseq

Иногда их называют расширяющими ключами. Предусмотрены следующие ключи:

  •  arrow — определят процедуру -оператор в нотации ->;
  •  bulltin — определяет функцию как встроенную;
  •  call_external — задает обращение к внешним программным модулям;
  •  copyright — защищает процедуру от копирования;
  •  inline — определяет процедуру как подчиненную (возможно, не для всех процедур - см. справку); 
  •  load=memberName — загружает нужный для определений процедуры модуль (см. также опцию unload и детали в справке); 
  •  operator — объявляет процедуру — функциональный оператор;
  •  system — определяет процедуру как системную,
  •  remember — определяет таблицу памяти для процедуры;
  •  trace — задает трассировку процедуры;
  •  unl oacNnemberName — выгружает нужный для определения процедуры модуль (см. опцию load).

Ключ remember

Ключ remember обеспечивает занесение результатов обращений к процедуре в таблицу памяти, которая используется при исполнении процедуры. Функция ор позволяет вывести таблицу:

> f:=proc(x) options remember; х^3 end: 

> f(2):

8

> f(3):

27

> op(4,eval(f)): table([2 = 8, 3 = 27]) ,

Ключ remember особенно полезен при реализации итерационных процедур. К примеру, в приведенной ниже процедуре (без использования ключа remember) время вычисления n-го числа Фибоначчи растет пропорционально квадрату n: 

> f:=proc(n) if n<2 then n else f(n-l)+f(n-2) fi end;

 f:=proc(w)if n <2 then и else f(n - l) + ft>-2)endif endproc 

> time(f(30)): 27.400 

> f(30): 832040

Вычисление f(30) по этой процедуре на ПК с процессором Pentium II 350 МГц занимает около 30 с — см. контроль этого времени с помощью функции time (результат в секундах).

Стоит добавить в процедуру ключ remember, и время вычислений резко уменьшится:

> restart;

> fe:-proc(n) options remember: if n<2 then n else fe(n-l)+fe(n-2) fi end: 

> fe(30);

832040

> time(fe(30)); 

0.

При этом вычисление fe(30) происходит практически мгновенно, так как все промежуточные результаты в первом случае вычисляются заново, а во втором они берутся из таблицы. Однако это справедливо лишь тогда, когда к процедуре было хотя бы однократное обращение. Обратите внимание на то, что данные процедуры являются рекурсивными — в их теле имеется обращение к самим себе.

 

Ключ builtin

Ключ builtin придает процедуре статус встроенной. Он должен использоваться всегда первым. С помощью функции eval(name) можно проверить, является ли функция с именем name встроенной:

> eval(type);

proc() option builtin; 268 end proc 

> eval(print);

proc() option builtin; 229 end proc

Числа в теле процедур указывают системные номера функций. Следует отметить, что в новой версии Maple 7 они существенно отличаются от принятых в предшествующих версиях.

Ключ system

Этот ключ придает процедуре статус системной. У таких процедур таблица памяти может быть удалена. У обычных процедур таблица памяти не удаляется и входит в так называемый «мусорный ящик» (garbage collector).

Ключи operator и arrow

Эта пара ключей задает процедуре статус оператора в «стрелочной» нотации (->). Это достаточно пояснить следующими примерами:

 

Ключ trace

Ключ trace задает вывод отладочной информации:

> о:=ргос(х,у) option trace, arrow; x-sqrt(y) end:  

о := proc (x, y) option trace, arrow, x - sqrt(y) end proc

> o(4,2.);

{--> enter o, args = 4,2.

2.585786438

<-- exit о (now at top level) = 2.585786438}

 2.585786438

 

Ключ copyright

Этот ключ защищает тело процедуры от просмотра. Это поясняют следующие два примера:

> o:=proc(x,y) x-sqrt(y) end: 

о := proc (x, у) х- sqii(y) end proc

> oo:=proc(x.y) option Copyright; x-sqrt(y) end;

oo := proc(x,y) ... endproc 

> oo(4.2);

2.585786438

Нетрудно заметить, что во втором примере тело процедуры уже не просматривается. Для отмены защиты от просмотра можно использовать оператор interfасе(verboseproc=2).

 


Top.Mail.Ru