|
Ключи в процедурах
В объявление процедуры можно включить
ключевые слова, вводимые словом
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).
|