тип данных библиотеки
Из чего сделана библиотека функций, написанных на языке Scilab?
Такая библиотека сделана из директории, содержащей
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 = " "
Version | Description |
6.0.0 |
|