1 <?xml version="1.0" encoding="UTF-8"?>
3 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
4 * Copyright (C) ????-2008 - INRIA
5 * Copyright (C) 2012 - 2016 - Scilab Enterprises
6 * Copyright (C) 2021 - Samuel GOUGEON
8 * This file is hereby licensed under the terms of the GNU GPL v2.0,
9 * pursuant to article 5.3.4 of the CeCILL v.2.1.
10 * This file was originally licensed under the terms of the CeCILL v2.1,
11 * and continues to be available under such terms.
12 * For more information, see the COPYING file which you should have received
13 * along with this program.
16 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
17 xmlns:svg="http://www.w3.org/2000/svg" xmlns:db="http://docbook.org/ns/docbook"
18 xmlns:scilab="http://www.scilab.org" xml:lang="ru" xml:id="library">
20 <refname>library</refname>
21 <refpurpose>тип данных библиотеки</refpurpose>
24 <title>Описание</title>
26 <emphasis role="bold">
27 Из чего сделана библиотека функций, написанных на языке Scilab?
31 Такая библиотека сделана из директории, содержащей
34 редактируемый XML-файл, который всегда называется <literal>lib</literal>.
41 список имён публичных функций, принадлежащих библиотеке.
44 Этот файл сгенерирован с помощью <literal>genlib(..)</literal>.
45 Его нельзя сделать вручную.
49 набор двоичных файлов с расширением <literal>.bin</literal>,
50 чьи основные имена являются именами функций возможно зарегистрированных
51 в файле <literal>lib</literal>,
55 и возможно -- но это необязательно для загрузки и использования
56 библиотеки --, <literal>.sci</literal>-файлы исходников, написанные
57 на языке Scilab, чья компиляция с помощью <code>genlib(..)</code>
58 генерирует файлы <literal>lib</literal> и <literal>.bin</literal>.
61 Если файл-исходник <literal>foo.sci</literal> функции
62 <literal>foo()</literal> не предоставлен в директории библиотеки,
63 то <literal>edit foo</literal> не может править его Scilab-код
64 и откроет пустой файл с нуля.
71 <emphasis role="bold">
72 Загрузка / декларирование библиотеки в сессии
76 <literal>load("/path/to/lib")</literal> загружает предназначенную библиотеку
77 в сессию Scilab: создаётся переменная, чьё имя является именем библиотеки
78 -- скажем <literal>libname</literal>. Относящийся к ней тип
79 <literal>type(libname)</literal> равен 14. Её <literal>typeof(libname)</literal>
80 соответствует <literal>"library"</literal>. Этот дескриптор библиотеки содержит
83 путь к корневой директории библиотеки;
86 список имён публичных функций, принадлежащих библиотеке.
91 Обе части могут быть получены либо с помощью функции <literal>libraryinfo()</literal>,
92 либо с помощью функции <literal>string()</literal>.
95 Пример: <literal>interpolationlib</literal> является родной библиотекой Scilab:
100 Functions files location : SCI\modules\interpolation\macros\.
101 interp1 mesh2d interpln smooth
103 --> type(interpolationlib)
107 --> [typeof(interpolationlib), typeof(interpolationlib, "overload")]
111 --> string(interpolationlib)
113 "SCI\modules\interpolation\macros\"
119 --> [fnames, libpath] = libraryinfo("interpolationlib")
127 "SCI\modules\interpolation\macros\"
131 <emphasis role="bold">Автозагрузка при первом вызове функции</emphasis>:
134 Если имя функции -- скажем, <literal>foo()</literal> -- принадлежащей
135 библиотеке, вызвана в сессии, то Scilab делает следующее:
138 Является ли <literal>foo</literal> именем встроенной функции?
139 Если так, то эта встроенная функция вызывается. В противном
144 Является ли <literal>foo</literal> именем локальной переменной,
145 возможно требуемой <literal>foo()</literal> (предполагая, что
146 она уже была вызвана)? Если так, то используется эта переменная.
151 Сканируются все загруженные библиотеки -- в обратном алфавитному порядку имён
152 библиотек -- для поиска <literal>foo()</literal>. Первая найденная
153 "загружается" из её <literal>.bin</literal>-файла и, наконец, вызывается.
154 Следующие вызовы <literal>foo()</literal> будут переходить к шагу №2,
155 который будет успешным, пока дескриптор <literal>foo</literal> не
156 будет удалён по ходу дела.
162 Без шага №3 пользовательская функция, не принадлежащая ни к одной библиотеке
163 и поэтому в случае удаления не может быть автоматически восстановлена.
167 Если файл<literal>foo.sci</literal> изменён, когда <literal>foo()</literal>
168 уже была вызвана, то перекомпиляция и перегрузка её библиотеки не обновит
169 текущее поведение <literal>foo()</literal>: <literal>foo()</literal>,
170 является уже известной, поэтому Scilab остановится на шаге №2 без
171 перегрузки обновлённой библиотеки и будет использовать прежнюю
172 <literal>foo()</literal>. Введение <literal>clear foo</literal> перед
173 следующим вызовом <literal>foo()</literal> заставит Scilab перейти
174 к шагу №3 во время следующего вызова и таким образом загрузит и будет
175 использовать обновлённую <literal>foo()</literal>.
179 <emphasis role="bold">Одноимённые функции в разных библиотеках: libname.foo()</emphasis>
182 Если несколько загруженных библиотек имеют публичную функцию
183 <literal>foo()</literal>, то обратный алфавитный приоритет может быть
184 неуместным. К счастью, всегда можно заставить использовать содержимое
185 указанной библиотеки с помощью синтаксиса разделения точкой:
186 <literal>libname.foo(..)</literal> будет вызывать содержимое
187 <literal>foo()</literal>, принадлежащее библиотеке <literal>libname</literal>.
191 <title>Примеры</title>
193 <literal>interpolationlib</literal> является родной библиотекой Scilab:
195 <programlisting role="example"><![CDATA[
196 interpolationlib //отображает содержимое библиотеки
197 type(interpolationlib)
198 [typeof(interpolationlib), typeof(interpolationlib, "overload")]
199 string(interpolationlib)
200 [fnames, libpath] = libraryinfo("interpolationlib")
203 Вывод иллюстрируется в разделе Описание выше.
207 Вызовы обработки одноимённых функций:
209 <programlisting role="example"><![CDATA[
211 clear blanks, isdef("blanks","l")
212 blanks(20) // загрузка blanks() и её вызов
213 isdef("blanks","l") // она остаётся в workspace
215 // Построение библиотеки с нашей собственной одноимённой функцией blanks()
216 libDir = fullfile(TMPDIR, "mylib");
217 code = ["function r = blanks(n, nbsp)"
218 " if nbsp, r = part(ascii(160),ones(1,n)),"
223 mputl(code, libDir + filesep() + "blanks.sci");
224 genlib("mylib", libDir); // Компиляция нашей собственной библиотеки
227 ascii(blanks(3)) // вызывается stringlib.blanks() ⇐ "stringlib" > "mylib"
229 ascii(mylib.blanks(3,%t)) // принудительный вызов mylib.blanks()
230 blanks(3) // следующий вызов по умолчанию stringlib.blanks()
237 --> clear blanks, isdef("blanks","l")
241 --> blanks(20) // loads blanks() and calls it
244 --> isdef("blanks","l") // It stays in the workspace
248 --> // Building a library with our own homonymous blanks() function
249 --> libDir = fullfile(TMPDIR, "mylib");
250 --> code = ["function r = blanks(n, nbsp)"
251 > " if nbsp, r = part(ascii(160),ones(1,n)),"
252 > " else r = ""ABC"","
256 --> mputl(code, libDir + filesep() + "blanks.sci");
257 --> genlib("mylib", libDir); // Compiling our own library
260 --> ascii(blanks(3)) // stringlib.blanks() is called ⇐ "stringlib" > "mylib"
265 --> ascii(mylib.blanks(3,%t)) // forced call to mylib.blanks()
267 194. 160. 194. 160. 194. 160.
269 --> blanks(3) // Next call is with the default stringlib.blanks()
274 <refsection role="see also">
275 <title>Смотрите также</title>
276 <simplelist type="inline">
278 <link linkend="load">load</link>
281 <link linkend="lib">lib</link>
284 <link linkend="genlib">genlib</link>
287 <link linkend="libraryinfo">libraryinfo</link>
290 <link linkend="string">string</link>
293 <link linkend="whereis">whereis</link>
296 <link linkend="librarieslist">librarieslist</link>
300 <refsection role="history">
301 <title>История</title>
304 <revnumber>6.0.0</revnumber>
308 Библиотека теперь содержать только функции, а не переменные
312 Файл lib теперь является редактируемым XML-файлом, а не бинарным.
315 Если файл исходного кода foo.sci содержит несколько последовательных
316 блоков function/endfunction, то только определённая foo() теперь
317 записывается в библиотеку. Остальные определённые функции теперь
318 являются приватными и известными только из foo().