library
тип данных библиотеки
Описание
Из чего сделана библиотека функций, написанных на языке Scilab?
Такая библиотека сделана из директории, содержащей
- редактируемый XML-файл, который всегда называется
lib
. Этот файл содержит- имя библиотеки;
- список имён публичных функций, принадлежащих библиотеке.
genlib(..)
. Его нельзя сделать вручную. - набор двоичных файлов с расширением
.bin
, чьи основные имена являются именами функций возможно зарегистрированных в файлеlib
, - и возможно -- но это необязательно для загрузки и использования
библиотеки --,
.sci
-файлы исходников, написанные на языке Scilab, чья компиляция с помощьюgenlib(..)
генерирует файлыlib
и.bin
.Если файл-исходникfoo.sci
функцииfoo()
не предоставлен в директории библиотеки, тоedit foo
не может править его Scilab-код и откроет пустой файл с нуля.
Загрузка / декларирование библиотеки в сессии:
load("/path/to/lib")
загружает предназначенную библиотеку
в сессию Scilab: создаётся переменная, чьё имя является именем библиотеки
-- скажем libname
. Относящийся к ней тип
type(libname)
равен 14. Её typeof(libname)
соответствует "library"
. Этот дескриптор библиотеки содержит
- путь к корневой директории библиотеки;
- список имён публичных функций, принадлежащих библиотеке.
Обе части могут быть получены либо с помощью функции libraryinfo()
,
либо с помощью функции string()
.
Пример: interpolationlib
является родной библиотекой Scilab:
--> interpolationlib interpolationlib = Functions files location : SCI\modules\interpolation\macros\. interp1 mesh2d interpln smooth --> type(interpolationlib) ans = 14. --> [typeof(interpolationlib), typeof(interpolationlib, "overload")] ans = "library" "f" --> string(interpolationlib) ans = "SCI\modules\interpolation\macros\" "interp1" "mesh2d" "interpln" "smooth" --> [fnames, libpath] = libraryinfo("interpolationlib") fnames = "interp1" "mesh2d" "interpln" "smooth" libpath = "SCI\modules\interpolation\macros\"
Автозагрузка при первом вызове функции:
Если имя функции -- скажем, foo()
-- принадлежащей
библиотеке, вызвана в сессии, то Scilab делает следующее:
- Является ли
foo
именем встроенной функции? Если так, то эта встроенная функция вызывается. В противном случае, - Является ли
foo
именем локальной переменной, возможно требуемойfoo()
(предполагая, что она уже была вызвана)? Если так, то используется эта переменная. В противном случае, - Сканируются все загруженные библиотеки -- в обратном алфавитному порядку имён
библиотек -- для поиска
foo()
. Первая найденная "загружается" из её.bin
-файла и, наконец, вызывается. Следующие вызовыfoo()
будут переходить к шагу №2, который будет успешным, пока дескрипторfoo
не будет удалён по ходу дела.
Без шага №3 пользовательская функция, не принадлежащая ни к одной библиотеке и поэтому в случае удаления не может быть автоматически восстановлена.
Если файл foo.sci изменён, когда foo()
уже была вызвана, то перекомпиляция и перегрузка её библиотеки не обновит
текущее поведение foo() : foo() ,
является уже известной, поэтому Scilab остановится на шаге №2 без
перегрузки обновлённой библиотеки и будет использовать прежнюю
foo() . Введение clear foo перед
следующим вызовом foo() заставит Scilab перейти
к шагу №3 во время следующего вызова и таким образом загрузит и будет
использовать обновлённую foo() . |
Одноимённые функции в разных библиотеках: libname.foo()
Если несколько загруженных библиотек имеют публичную функцию
foo()
, то обратный алфавитный приоритет может быть
неуместным. К счастью, всегда можно заставить использовать содержимое
указанной библиотеки с помощью синтаксиса разделения точкой:
libname.foo(..)
будет вызывать содержимое
foo()
, принадлежащее библиотеке libname
.
Примеры
interpolationlib
является родной библиотекой Scilab:
interpolationlib //отображает содержимое библиотеки type(interpolationlib) [typeof(interpolationlib), typeof(interpolationlib, "overload")] string(interpolationlib) [fnames, libpath] = libraryinfo("interpolationlib")
Вывод иллюстрируется в разделе Описание выше.
Вызовы обработки одноимённых функций:
whereis(blanks) clear blanks, isdef("blanks","l") blanks(20) // загрузка blanks() и её вызов isdef("blanks","l") // она остаётся в workspace // Построение библиотеки с нашей собственной одноимённой функцией blanks() libDir = fullfile(TMPDIR, "mylib"); code = ["function r = blanks(n, nbsp)" " if nbsp, r = part(ascii(160),ones(1,n))," " else r = ""ABC""," " end" "endfunction" ]; mkdir(libDir); mputl(code, libDir + filesep() + "blanks.sci"); genlib("mylib", libDir); // Компиляция нашей собственной библиотеки clear blanks ascii(blanks(3)) // вызывается stringlib.blanks() ⇐ "stringlib" > "mylib" clear blanks ascii(mylib.blanks(3,%t)) // принудительный вызов mylib.blanks() blanks(3) // следующий вызов по умолчанию stringlib.blanks()
--> whereis(blanks) ans = "stringlib" --> clear blanks, isdef("blanks","l") ans = F --> blanks(20) // loads blanks() and calls it ans = " " --> isdef("blanks","l") // It stays in the workspace ans = T --> // Building a library with our own homonymous blanks() function --> libDir = fullfile(TMPDIR, "mylib"); --> code = ["function r = blanks(n, nbsp)" > " if nbsp, r = part(ascii(160),ones(1,n))," > " else r = ""ABC""," > " end" > "endfunction" ]; --> mkdir(libDir); --> mputl(code, libDir + filesep() + "blanks.sci"); --> genlib("mylib", libDir); // Compiling our own library --> clear blanks --> ascii(blanks(3)) // stringlib.blanks() is called ⇐ "stringlib" > "mylib" ans = 32. 32. 32. --> clear blanks --> ascii(mylib.blanks(3,%t)) // forced call to mylib.blanks() ans = 194. 160. 194. 160. 194. 160. --> blanks(3) // Next call is with the default stringlib.blanks() ans = " "
Смотрите также
- load — Loads some archived variables, a saved graphic figure, a library of functions
- lib — loads a library of Scilab functions and variables, and sets its name
- genlib — строит библиотеку из набора *.sci-файлов, определяющих функции в указанной директории
- libraryinfo — получает путь и устанавливает главные функции загруженной библиотеки
- string — преобразование в строку
- whereis — Returns the name of the loaded library/module a given function belongs to
- librarieslist — gets the list of loaded Scilab libraries
История
Версия | Описание |
6.0.0 |
|
Report an issue | ||
<< Lambda functions | types | матрицы >> |