Ключи в процедурах
В объявление процедуры можно включить ключевые слова, вводимые словом 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-1)+f(n-2) fi end; f: = proc(w)if n <2 then и else f(n -1) + 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 они существенно отличаются от принятых в предшествующих версиях.