M Mobile Shell:Reference:Language:Modules

Материал из mShellWiki
Перейти к: навигация, поиск

Модули (en)

[править заголовок, править ссылку на оригинал, править текст, править список подразделов, править список разделов]

Модуль в m является скриптом (текстовым файлом), который можно загрузить другими скриптами, чтобы получить доступ к функциям и переменным в модуле.

Модули служат двум целям:

  • Они помогают структурировать сложные скрипты и делают их проще для понимания и поддержки.
  • Они предоставляют способ расширения функциональности m, добавляя новые функции, которые могут быть потом использованы всеми скриптами или интерактивными сеансами. Таким образом могут быть созданы целые библиотеки часто используемых функций. Стандартная библиотека m организована в модули.

Чтобы загрузить модуль, требуется пункт use:

use ModuleName1, ModuleName2, ...

Это загружает модули ModuleName1, ModuleName2 и т.д. инициализует их, т.е. исполняет их основной код. Каждый модуль инициализируется единожды за процесс, даже если он загружается несколько раз разными модулями.

Имена модулей не чувствительны к регистру, поскольку они определяются именами файлов в операционной системе. Файл:m Mobile Shell warning.png

use System // загрузить модуль "system"
print System.appdir; // это будет работать
print system.appdir // это то же самое

Наряду с именем модуля можно использовать псевдоним, чтобы переобозначить модуль, например, аббревиатура длинного имени модуля. Псевдонимы доступны внутри кода, включающего пункт use. Так же, как имена модулей, они не чувствительны к регистру:

use ModuleName as AliasName

В качестве примера рассмотрим следующий модуль accounts, обслуживающий список счетов и поддерживающий переводы между ними:

S=[]; // инициализация модуля
function get(nr)
  x=accounts.S[nr];
  // все счита начинаются с 0
  if x=null then x=0 end;
  return x
end
function xfer(f, t, x)
  ..S[f]=get(f)-x;
  ..S[t]=get(t)+x
end

Внутри функций перед глобальной переменной S должно быть указано имя модуля (accounts.S) или две точки, обозначающие текущий модуль (..S).

Модуль может быть использован следующим образом:

// загрузить модуль и назвать его 'acc'.
use accounts as acc
// передать деньши от blue к bank
acc.xfer('blue', 'bank', 100000);
print acc.get('bank')
→ 100000
// передать деньги от bank к Daltons
acc.xfer('bank', 'Daltons', 10000);
print acc.get('bank')
→ 90000
// показать все счета
print acc.S
→ [-100000, 90000, 10000]

Порядок поиска модулей (en)

[править заголовок, править ссылку на оригинал, править текст]

При встрече пункта use компилятор m ищет модули в следующем порядке.

  1. Список установленных базовых модулей (расположение базовых модулей определено системой и не может быть изменено).
  2. Директория компилируемого скрипта.
  3. Папки из Путей Библиотеки в том порядке, в котором были добавлены, т.е. перечислены в свойстве libpath.
  4. Директория m-приложения (константа system.appdir).

Префиксы модулей (en)

[править заголовок, править ссылку на оригинал, править текст]

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

Внутри модуля перед его глобальными переменными и функциями могут стоять две точки ..: выше в коде модуля accounts ..S обозначает ту же переменную, что и accounts.S.

Префикс не всегда требуется, если переменная или функция используется внутри ее содержащего модуля. Более того, функции, объявленные в основном скрипте, или встроенные стандартные функции нуждаются в префиксе только если существует функция с таким же именем в текущем модуле. Следующая таблица обобщает то, как интерпретируются переменные и функции без префикса модуля:

Переменная x Функция f
основной модуль глобальная .x .f
функция в основном модуле локальная x .f
модуль M глобальная M.x M.f, если существует; иначе .f
функция в модуле M локальная x M.f, если существует; иначе .f

Файл:m Mobile Shell hint.png

Версия модуля (en)

[править заголовок, править ссылку на оригинал, править текст]

Шаблон:M Mobile Shell:Reference:Language:Modules:Module Version::текст

Необязательные модули (en)

[править заголовок, править ссылку на оригинал, править текст]

Шаблон:M Mobile Shell:Reference:Language:Modules:Optional Modules::текст


© 2004-2009 airbit AG, CH-8008 Zürich
перевод от m-shell.ru

Наши друзья
Личные инструменты