<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
<title>FreeSource - AltLinux/Sisyphus/Alterator/internals/4</title>
<link>http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4</link>
<description>History/revisions of FreeSource/AltLinux/Sisyphus/Alterator/internals/4</description>
<language>en-us</language>
<item>
<title>2006-10-31 17:19:27</title>
<link>http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4/show?time=2006-10-31+17%3A19%3A27</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a name=".altlinux.sisyphus.alterator.internals.4" href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4&amp;" class="">/Alt&amp;nbsp;Linux&amp;nbsp;/&amp;nbsp;Sisyphus&amp;nbsp;/&amp;nbsp;Alterator&amp;nbsp;/&amp;nbsp;internals&amp;nbsp;/&amp;nbsp;4&lt;/a> за &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4?time=2006-10-31+17%3A19%3A27">2006-10-31 17:19:27&lt;/a> и &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4">2008-03-06 15:19:57&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;div class="action" style="float:right; width:250px">&lt;div class="action-content">Эта&amp;nbsp;страница была перенесена на&amp;nbsp;&lt;a href="http://altlinux.org/Alterator/internals/4" target="_blank" title="" class="outerlink">altlinux.org&lt;/a>. Текст на&amp;nbsp;freesource.info заморожен.&lt;/div>&lt;/div>&lt;br />
После того как&amp;nbsp;все переменные разобраны, если в&amp;nbsp;результате остаётся  список, то&amp;nbsp;происходит запуск функции. Первый элемент списка &amp;ndash; собственно указатель на&amp;nbsp;саму функцию, например в&amp;nbsp;одном из&amp;nbsp;наших примеров &amp;ndash; это&amp;nbsp;стандартная функция &lt;tt>string-append&lt;/tt>, а&amp;nbsp;все оставшиеся &amp;ndash; это&amp;nbsp;аргументы функции. Вычисляем указанную функцию от&amp;nbsp;данных аргументов (в том&amp;nbsp;же&amp;nbsp;примере &amp;ndash; это&amp;nbsp;две константные строки &lt;tt>&amp;#8220;str1&amp;#8221;&lt;/tt> и&amp;nbsp;&lt;tt>&amp;#8220;str2&amp;#8221;&lt;/tt>) ... и&amp;nbsp;получаем результат исполнения.&lt;br />
&lt;tt>(some-func a&amp;nbsp;#t (+ 1 3))&lt;/tt> &amp;ndash; получим результат выполнения функции от&amp;nbsp;аргументов:&lt;br />
 &amp;mdash; логическая ложь&lt;br />
Если в&amp;nbsp;результате вы&amp;nbsp;получили простую структуру, состоящую из&amp;nbsp;списков, возможно вложенных и&amp;nbsp;каких-либо констант(строк, чисел, символов), то&amp;nbsp;&lt;tt>write&lt;/tt> напечатает их&amp;nbsp;в таком виде, что&amp;nbsp;потом &lt;tt>read&lt;/tt> может их&amp;nbsp;обратно съесть.&lt;br />
Ну&amp;nbsp;а теперь повторим пройденное. Помните про&amp;nbsp;функцию &lt;tt>quote&lt;/tt>, которая позволяла заполучить символы? &lt;tt>quote&lt;/tt> просто напросто говорит интерпретатору, что&amp;nbsp;не&amp;nbsp;надо исполнять &lt;tt>eval&lt;/tt> после &lt;tt>read&lt;/tt>.&lt;br />
&lt;ul>&lt;li> &lt;tt>(if #f 3)&lt;/tt> &amp;ndash; поскольку &lt;tt>&amp;laquo;команда-если-ложь&amp;raquo;&lt;/tt> отсутствует, то&amp;nbsp;&lt;tt>if&lt;/tt> вернёт некоторое волшебную сущность, которую иногда называют unspecific, иногда unspecified  &amp;mdash; в&amp;nbsp;общем &amp;laquo;то, не&amp;nbsp;знаю что&amp;raquo; или&amp;nbsp;&amp;laquo;неопределенное значение&amp;raquo; &amp;ndash; особый вид&amp;nbsp;значения.&lt;/li>&lt;/ul>&lt;a name="h5141-1">&lt;/a>&lt;h4>10.3 Последовательное исполнение&lt;/h4>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">После того как&amp;nbsp;все переменные разобраны, то&amp;nbsp;если в&amp;nbsp;результате остаётся  писок, то&amp;nbsp;происходит запуск функции. Первый элемент списка &amp;ndash; собственно указатель на&amp;nbsp;саму функцию, например в&amp;nbsp;одном из&amp;nbsp;наших примеров &amp;ndash; это&amp;nbsp;стандартная функция &lt;tt>string-append&lt;/tt>, а&amp;nbsp;все оставшиеся &amp;ndash; это&amp;nbsp;аргументы функции. Вычисляем указанную функцию от&amp;nbsp;данных аргументов (в том&amp;nbsp;же&amp;nbsp;примере &amp;ndash; это&amp;nbsp;две константные строки &lt;tt>&amp;#8220;str1&amp;#8221;&lt;/tt> и&amp;nbsp;&lt;tt>&amp;#8220;str2&amp;#8221;&lt;/tt>) ... и&amp;nbsp;получаем результат исполнения.&lt;br />
&lt;tt>(some-func a&amp;nbsp;#t (+ 1 3))&lt;/tt> &amp;ndash; получим результат выполнения функцию от&amp;nbsp;аргументов:&lt;br />
 &amp;mdash; лочическая ложь&lt;br />
Если в&amp;nbsp;результате вы&amp;nbsp;получили простую структуру, соcтоящую из&amp;nbsp;списков, возможно вложенных и&amp;nbsp;каких-либо констант(строк, чисел, символов), то&amp;nbsp;&lt;tt>write&lt;/tt> напечатает их&amp;nbsp;в таком виде, что&amp;nbsp;потом &lt;tt>read&lt;/tt> может их&amp;nbsp;обратно съесть.&lt;br />
Ну&amp;nbsp;а теперь повторим пройдённое. Помните про&amp;nbsp;функцию &lt;tt>quote&lt;/tt>, которая позволяла заполучить символы? &lt;tt>quote&lt;/tt> просто напросто говорит интерпретатору, что&amp;nbsp;не&amp;nbsp;надо исполнять &lt;tt>eval&lt;/tt> после &lt;tt>read&lt;/tt>.&lt;br />
&lt;ul>&lt;li> &lt;tt>(if #f 3)&lt;/tt> &amp;ndash; поскольку &lt;tt>&amp;laquo;команда-если-ложь&amp;raquo;&lt;/tt> отсутствует, то&amp;nbsp;&lt;tt>if&lt;/tt> вернёт некоторое волшебную сущность, которую иногда называют unspecific, иногда unspecified  &amp;mdash; в&amp;nbsp;общем &amp;laquo;то, не&amp;nbsp;знаю что&amp;raquo;.&lt;/li>&lt;/ul>&lt;a name="h5141-1">&lt;/a>&lt;h4>10.3 последовательное исполнение&lt;/h4>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2006-10-31 17:07:49</title>
<link>http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4/show?time=2006-10-31+17%3A07%3A49</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4&amp;" class="">/Alt&amp;nbsp;Linux&amp;nbsp;/&amp;nbsp;Sisyphus&amp;nbsp;/&amp;nbsp;Alterator&amp;nbsp;/&amp;nbsp;internals&amp;nbsp;/&amp;nbsp;4&lt;/a> за &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4?time=2006-10-31+17%3A07%3A49">2006-10-31 17:07:49&lt;/a> и &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4?time=2006-10-31+17%3A19%3A27">2006-10-31 17:19:27&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">В&amp;nbsp;отдельных случаях хочется заранее знать, как&amp;nbsp;и&amp;nbsp;когда будут аргументы вычислены. Поскольку эти&amp;nbsp;&amp;laquo;функции&amp;raquo; такие особые, то&amp;nbsp;и называются они&amp;nbsp;&amp;laquo;особые формы&amp;raquo;, вот&amp;nbsp;основные, которые нам&amp;nbsp;потребуются на&amp;nbsp;практике.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">В&amp;nbsp;отдельных случаях хочется заранее знать, как&amp;nbsp;и&amp;nbsp;когда будут аргументы вычислены. Поскольку эти&amp;nbsp;&amp;laquo;функции&amp;raquo; такие особые, то&amp;nbsp;и называются они&amp;nbsp;&amp;laquo;особые формы&amp;raquo;, вот&amp;nbsp;основные, которые нам&amp;nbsp;потребуются при&amp;nbsp;работе с&amp;nbsp;alterator.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-11-07 11:56:56</title>
<link>http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4/show?time=2005-11-07+11%3A56%3A56</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4&amp;" class="">/Alt&amp;nbsp;Linux&amp;nbsp;/&amp;nbsp;Sisyphus&amp;nbsp;/&amp;nbsp;Alterator&amp;nbsp;/&amp;nbsp;internals&amp;nbsp;/&amp;nbsp;4&lt;/a> за &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4?time=2005-11-07+11%3A56%3A56">2005-11-07 11:56:56&lt;/a> и &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4?time=2006-10-31+17%3A07%3A49">2006-10-31 17:07:49&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;a name="h5141-1">&lt;/a>&lt;h3>9 Открываем капот.&lt;/h3>
Давайте разберёмся с&amp;nbsp;тем, как&amp;nbsp;работает интерпретатор Scheme, благо знания нам&amp;nbsp;уже это&amp;nbsp;позволяют сделать. После этого всё, что&amp;nbsp;было до&amp;nbsp;сего момента неясно, уже&amp;nbsp;станет очевидным.&lt;a name="h5141-2">&lt;/a>&lt;h4>9.1 Чтение&lt;/h4>&lt;a name="h5141-3">&lt;/a>&lt;h4>9.2 Исполнение&lt;/h4>&lt;a name="h5141-4">&lt;/a>&lt;h4>9.3 Вывод результата на&amp;nbsp;экран&lt;/h4>&lt;a name="h5141-5">&lt;/a>&lt;h4>9.4&lt;/h4>&lt;a name="h5141-6">&lt;/a>&lt;h3>10 Особые формы&lt;/h3>&lt;a name="h5141-7">&lt;/a>&lt;h4>10.1 Условные выражения&lt;/h4>&lt;a name="h5141-8">&lt;/a>&lt;h4>10.2 Множественное ветвление&lt;/h4>&lt;a name="h5141-9">&lt;/a>&lt;h4>10.3 последовательное исполнение&lt;/h4>
&lt;span class="missingpage">Продолжение следует&lt;/span>&lt;a href="http://freesource.info/wiki/5/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Часть информации в&amp;nbsp;ней будет касаться alterator, которого пока ещё нет&amp;nbsp;в&amp;nbsp;Сизифе, но&amp;nbsp;он скоро до&amp;nbsp;него доберётся.&lt;a name="h5141-1">&lt;/a>&lt;h3>2.10 Открываем капот.&lt;/h3>
Давайте разберёмся с&amp;nbsp;тем, как&amp;nbsp;работает интерпретатор Схемы, благо знания нам&amp;nbsp;уже это&amp;nbsp;позволяют сделать. После этого всё, что&amp;nbsp;было до&amp;nbsp;сего момента неясно, уже&amp;nbsp;станет очевидным.&lt;a name="h5141-2">&lt;/a>&lt;h4>2.10.1 Чтение&lt;/h4>&lt;a name="h5141-3">&lt;/a>&lt;h4>2.10.2 Исполнение&lt;/h4>&lt;a name="h5141-4">&lt;/a>&lt;h4>2.10.3 Вывод результата на&amp;nbsp;экран&lt;/h4>&lt;a name="h5141-5">&lt;/a>&lt;h4>2.10.4&lt;/h4>&lt;a name="h5141-6">&lt;/a>&lt;h3>2.11 Особые формы&lt;/h3>&lt;a name="h5141-7">&lt;/a>&lt;h4>2.11.1 Условные выражения&lt;/h4>&lt;a name="h5141-8">&lt;/a>&lt;h4>2.11.2 Множественное ветвление&lt;/h4>&lt;a name="h5141-9">&lt;/a>&lt;h4>2.11.3 последовательное исполнение&lt;/h4>&lt;a name="h5141-10">&lt;/a>&lt;h3>2.12 Вернёмся к&amp;nbsp;alterator&lt;/h3>
Попробуем применить полученные знания к&amp;nbsp;alterator.&lt;br />
Попробуем сделать форму, состоящую из:&lt;br />
 &amp;ndash; поля ввода (&lt;tt>edit&lt;/tt>)&lt;br />
 &amp;ndash; метки (&lt;tt>label&lt;/tt>)&lt;br />
 &amp;ndash; галки (&lt;tt>checkbox&lt;/tt>) &lt;em>(не знаю как&amp;nbsp;это сказать по-русски) &amp;mdash; inger@&lt;/em>&lt;br />
При&amp;nbsp;вводе чего-либо в&amp;nbsp;&lt;tt>edit&lt;/tt> метка получит текст &amp;#8220;something changed&amp;#8221;&lt;br />
При&amp;nbsp;нажатии Enter метка получит текст &amp;#8220;enter pressed&amp;#8221;&lt;br />
&lt;tt>checkbox&lt;/tt> будет переключать режим отображения &lt;tt>edit&lt;/tt> &amp;ndash; нормальный и&amp;nbsp;звездочками (как при&amp;nbsp;вводе пароля).&lt;br />
Раздадим имена виджетам:&lt;br />
&lt;ul>&lt;li> edit &amp;ndash; editor
&lt;/li>&lt;li> label &amp;ndash; lbl&amp;nbsp;&lt;/li>&lt;li> checkbox &amp;ndash; setter.&lt;/li>&lt;/ul>
На&amp;nbsp;этом краткое введение в&amp;nbsp;Scheme завершается, но&amp;nbsp;не заканчивается. В&amp;nbsp;ходе дальнейшего рассказа про&amp;nbsp;alterator мы&amp;nbsp;попутно будем совершенствоваться в&amp;nbsp;этом языке и&amp;nbsp;изучать новые подробности.&lt;br />
Если хотим узнать выставленна ли&amp;nbsp;галочка у&amp;nbsp;&lt;tt>checkbox&lt;/tt> по&amp;nbsp;имени &lt;tt>setter&lt;/tt>, переформулируем эту&amp;nbsp;фразу на&amp;nbsp;языке alterator следующим образом: &lt;tt>(setter checked)&lt;/tt>&lt;br />
В&amp;nbsp;результате получаем или&amp;nbsp;&lt;tt>#t&lt;/tt> или&amp;nbsp;&lt;tt>#f&lt;/tt>.&lt;br />
Итак, вот&amp;nbsp;какое описание формы получается, если собрать всё воедино:&lt;br />
(document:surround &amp;laquo;/std/base&amp;raquo;)&lt;br />
(document:id editor (edit &amp;quot;&amp;quot;&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">(on-change (lbl text &amp;#8220;something changed&amp;#8221;))&lt;br />
(on-return (lbl text &amp;#8220;enter pressed&amp;#8221;))))&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>
(document:id lbl&amp;nbsp;(label &amp;#8220;some label&amp;#8221;))&lt;br />
(document:id setter (checkbox &amp;#8220;Password mode&amp;#8221;&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">(on-click (if (setter state)&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">(editor echo stars)&lt;br />
(editor echo yes)))))&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>
&lt;span class="missingpage">5&lt;/span>&lt;a href="http://freesource.info/wiki/5/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-09-26 16:13:33</title>
<link>http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4/show?time=2005-09-26+16%3A13%3A33</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4&amp;" class="">/Alt&amp;nbsp;Linux&amp;nbsp;/&amp;nbsp;Sisyphus&amp;nbsp;/&amp;nbsp;Alterator&amp;nbsp;/&amp;nbsp;internals&amp;nbsp;/&amp;nbsp;4&lt;/a> за &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4?time=2005-09-26+16%3A13%3A33">2005-09-26 16:13:33&lt;/a> и &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4?time=2005-11-07+11%3A56%3A56">2005-11-07 11:56:56&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">(document:surround &amp;laquo;/std/base&amp;raquo;)&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">(on-click (if (setter state)&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">(document:surround &amp;laquo;/std/base&amp;raquo;&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">(on-click (if (setter checked)&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-07-20 17:22:42</title>
<link>http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4/show?time=2005-07-20+17%3A22%3A42</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4&amp;" class="">/Alt&amp;nbsp;Linux&amp;nbsp;/&amp;nbsp;Sisyphus&amp;nbsp;/&amp;nbsp;Alterator&amp;nbsp;/&amp;nbsp;internals&amp;nbsp;/&amp;nbsp;4&lt;/a> за &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4?time=2005-07-20+17%3A22%3A42">2005-07-20 17:22:42&lt;/a> и &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4?time=2005-09-26+16%3A13%3A33">2005-09-26 16:13:33&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">(document:surround &amp;laquo;/std/base&amp;raquo;&lt;br />
(document:id editor (edit &amp;quot;&amp;quot;&lt;br />
(document:id lbl&amp;nbsp;(label &amp;#8220;some label&amp;#8221;))&lt;br />
(document:id setter (checkbox &amp;#8220;Password mode&amp;#8221;&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">(id 'editor (edit &amp;quot;&amp;quot;&lt;br />
(id 'lbl (label &amp;#8220;some label&amp;#8221;))&lt;br />
(id 'setter (checkbox &amp;#8220;Password mode&amp;#8221;&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-07-20 00:52:55</title>
<link>http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4/show?time=2005-07-20+00%3A52%3A55</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4&amp;" class="">/Alt&amp;nbsp;Linux&amp;nbsp;/&amp;nbsp;Sisyphus&amp;nbsp;/&amp;nbsp;Alterator&amp;nbsp;/&amp;nbsp;internals&amp;nbsp;/&amp;nbsp;4&lt;/a> за &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4?time=2005-07-20+00%3A52%3A55">2005-07-20 00:52:55&lt;/a> и &lt;a href="http://freesource.info/wiki/AltLinux/Sisyphus/Alterator/internals/4?time=2005-07-20+17%3A22%3A42">2005-07-20 17:22:42&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Часть информации в&amp;nbsp;ней будет касаться alterator, которого пока ещё нет&amp;nbsp;в&amp;nbsp;Сизифе, но&amp;nbsp;он скоро до&amp;nbsp;него доберётся.&lt;a name="h5141-1">&lt;/a>&lt;h3>2.10 Открываем капот.&lt;/h3>
Может быть, из&amp;nbsp;академических соображений так&amp;nbsp;поступать не&amp;nbsp;стоит, однако иногда бывает проще рассказать про&amp;nbsp;причину, чем&amp;nbsp;про её следствия.&lt;br />
Давайте разберёмся с&amp;nbsp;тем, как&amp;nbsp;работает интерпретатор Схемы, благо знания нам&amp;nbsp;уже это&amp;nbsp;позволяют сделать. После этого всё, что&amp;nbsp;было до&amp;nbsp;сего момента неясно, уже&amp;nbsp;станет очевидным.&lt;br />
&lt;ul>&lt;li> прочитать очередное выражение
&lt;/li>&lt;li> провести интерпретацию этого выражения&lt;/li>&lt;/ul>
Если мы&amp;nbsp;находимся в&amp;nbsp;командном интерпретаторе, то&amp;nbsp;после последнего этапа ещё происходит печать получившегося выражения.&lt;br />
Вот&amp;nbsp;собственно и&amp;nbsp;всё! Теперь разберёмся с&amp;nbsp;каждым шагом. Как&amp;nbsp;и&amp;nbsp;многое другое, процесс интерпретации разделён на&amp;nbsp;несколько отдельных функций, что&amp;nbsp;позволяет контролировать его&amp;nbsp;с&amp;nbsp;точностью до&amp;nbsp;миллиметра, если это&amp;nbsp;конечно надо.&lt;a name="h5141-2">&lt;/a>&lt;h4>2.10.1 Чтение&lt;/h4>
Прочитать выражение позволяет функция &lt;tt>read&lt;/tt>. По&amp;nbsp;умолчанию чтение происходит со&amp;nbsp;стандартного ввода. Глядя на&amp;nbsp;примеры выражений и&amp;nbsp;любовь языка к&amp;nbsp;списковым структурам в&amp;nbsp;круглых скобках, несложно догадаться, что&amp;nbsp;мы&amp;nbsp;получаем на&amp;nbsp;выходе из&amp;nbsp;&lt;tt>read&lt;/tt> ... правильно &amp;mdash; именно списки и&amp;nbsp;получаем, ну&amp;nbsp;или просто константы, если скобок не&amp;nbsp;было.&lt;br />
Первое &amp;ndash; константа &amp;ndash; число &lt;tt>3&lt;/tt>&lt;br />
Второе &amp;ndash; константа &amp;ndash; строка &lt;tt>&amp;#8220;string&amp;#8221;&lt;/tt>&lt;br />
&lt;ul>&lt;li> символ &lt;tt>+&lt;/tt> (вот они&amp;nbsp;символы-то! не&amp;nbsp;спроста они&amp;nbsp;в&amp;nbsp;языке существуют ;))
&lt;/li>&lt;li> число &lt;tt>1&lt;/tt>
&lt;/li>&lt;li> число &lt;tt>3&lt;/tt>
&lt;/li>&lt;li> константа &amp;ndash; символ &lt;tt>some-func&lt;/tt>
&lt;/li>&lt;li> константа &amp;ndash; символ &lt;tt>a&lt;/tt>
&lt;/li>&lt;li> константа &amp;ndash; логическая ложь.
&lt;/li>&lt;li> ещё один список из: символа &lt;tt>+&lt;/tt> и&amp;nbsp;чисел &lt;tt>1&lt;/tt> и&amp;nbsp;&lt;tt>3&lt;/tt>.&lt;/li>&lt;/ul>
Шестое &amp;ndash; символ &lt;tt>a&lt;/tt>.&lt;a name="h5141-3">&lt;/a>&lt;h4>2.10.2 Исполнение&lt;/h4>
Исполнить полученный список, можно с&amp;nbsp;помощью функции &lt;tt>eval&lt;/tt>, которой передаются два&amp;nbsp;параметра: список и&amp;nbsp;среда исполнения. Что&amp;nbsp;такое второй параметр &amp;mdash; не&amp;nbsp;будем пока заморачиваться, а&amp;nbsp;примем как&amp;nbsp;данность.&lt;br />
Исполнитель рекурсивно пробегается по&amp;nbsp;всем вложенным спискам, большинство констант интерпретируются в&amp;nbsp;них самих (строки в&amp;nbsp;строки, числа в&amp;nbsp;числа), а&amp;nbsp;вот наткнувшись на&amp;nbsp;символ, производится поиск соотв. переменной и&amp;nbsp;в результате подставляется то&amp;nbsp;на что&amp;nbsp;она ссылается (Note: здесь описана так&amp;nbsp;называемая подстановочная модель, она&amp;nbsp;не&amp;nbsp;точная, зато простая и&amp;nbsp;понятная, то&amp;nbsp;что происходит в&amp;nbsp;реальном интерпретаторе &amp;mdash; гораздо сложнее, но&amp;nbsp;суть остаётся примерно та&amp;nbsp;же)&lt;br />
После того как&amp;nbsp;все переменные разобраны, то&amp;nbsp;если в&amp;nbsp;результате остаётся  писок, то&amp;nbsp;происходит запуск функции. Первый элемент списка &amp;ndash; собственно указатель на&amp;nbsp;саму функцию, например в&amp;nbsp;одном из&amp;nbsp;наших примеров &amp;ndash; это&amp;nbsp;стандартная функция &lt;tt>string-append&lt;/tt>, а&amp;nbsp;все оставшиеся &amp;ndash; это&amp;nbsp;аргументы функции. Вычисляем указанную функцию от&amp;nbsp;данных аргументов (в том&amp;nbsp;же&amp;nbsp;примере &amp;ndash; это&amp;nbsp;две константные строки &lt;tt>&amp;#8220;str1&amp;#8221;&lt;/tt> и&amp;nbsp;&lt;tt>&amp;#8220;str2&amp;#8221;&lt;/tt>) ... и&amp;nbsp;получаем результат исполнения.&lt;br />
&lt;tt>3&lt;/tt> --&amp;gt; собственно &lt;tt>3&lt;/tt> и&amp;nbsp;получим, никаких функций запускать не&amp;nbsp;надо&lt;br />
&lt;tt>&amp;#8220;string&amp;#8221;&lt;/tt> --&amp;gt; получим строку&lt;br />
&lt;tt>(+ 1 3)&lt;/tt> --&amp;gt; выполним функцию сложения от&amp;nbsp;аргументов &lt;tt>1&lt;/tt> и&amp;nbsp;&lt;tt>3&lt;/tt>, результат &amp;ndash; число &lt;tt>4&lt;/tt>.&lt;br />
&lt;tt>(string-append &amp;#8220;str1&amp;#8221; &amp;#8220;str2&amp;#8221;)&lt;/tt> &amp;ndash; результат &amp;ndash; строка &lt;tt>&amp;#8220;str1str2&amp;#8221;&lt;/tt>&lt;br />
&lt;tt>(some-func a&amp;nbsp;#t (+ 1 3))&lt;/tt> &amp;ndash; получим результат выполнения функцию от&amp;nbsp;аргументов:&lt;br />
 &amp;mdash; значение переменной &lt;tt>a&lt;/tt>&lt;br />
 &amp;mdash; лочическая ложь&lt;br />
 &amp;mdash; результат сложения &lt;tt>1&lt;/tt> и&amp;nbsp;&lt;tt>3&lt;/tt>, то&amp;nbsp;есть аргумент равен &lt;tt>4&lt;/tt>.&lt;br />
&lt;tt>a&lt;/tt> --&amp;gt; значение переменной &lt;tt>a&lt;/tt>&lt;a name="h5141-4">&lt;/a>&lt;h4>2.10.3 Вывод результата на&amp;nbsp;экран&lt;/h4>
Для&amp;nbsp;вывода результата на&amp;nbsp;экран есть множество функций, самая интересная из&amp;nbsp;них это, пожалуй, &lt;tt>write&lt;/tt>.&lt;br />
Если в&amp;nbsp;результате вы&amp;nbsp;получили простую структуру, соcтоящую из&amp;nbsp;списков, возможно вложенных и&amp;nbsp;каких-либо констант(строк, чисел, символов), то&amp;nbsp;&lt;tt>write&lt;/tt> напечатает их&amp;nbsp;в таком виде, что&amp;nbsp;потом &lt;tt>read&lt;/tt> может их&amp;nbsp;обратно съесть.&lt;br />
&lt;tt>7&lt;/tt> напечатается как&amp;nbsp;&lt;tt>7&lt;/tt>&lt;br />
&lt;tt>&amp;#8220;str&amp;#8221;&lt;/tt> напечатается как&amp;nbsp;&lt;tt>&amp;#8220;str&amp;#8221;&lt;/tt>&lt;br />
Списки опять напечатаются как&amp;nbsp;знакомые выражения, окруженные скобками, например список из&amp;nbsp;&lt;tt>1&lt;/tt> &lt;tt>2&lt;/tt> и&amp;nbsp;&lt;tt>3&lt;/tt> будет напечатан как&amp;nbsp;&lt;tt>(1 2 3)&lt;/tt>&lt;a name="h5141-5">&lt;/a>&lt;h4>2.10.4&lt;/h4>
Ну&amp;nbsp;а теперь повторим пройдённое. Помните про&amp;nbsp;функцию &lt;tt>quote&lt;/tt>, которая позволяла заполучить символы? &lt;tt>quote&lt;/tt> просто напросто говорит интерпретатору, что&amp;nbsp;не&amp;nbsp;надо исполнять &lt;tt>eval&lt;/tt> после &lt;tt>read&lt;/tt>.&lt;br />
Поэтому &lt;tt>'a&lt;/tt> &amp;ndash; это&amp;nbsp;просто символ &lt;tt>a&lt;/tt>&lt;br />
&lt;tt>'(1 2 3)&lt;/tt> &amp;ndash; это&amp;nbsp;список из&amp;nbsp;&lt;tt>1&lt;/tt> &lt;tt>2&lt;/tt> &lt;tt>3&lt;/tt>&lt;a name="h5141-6">&lt;/a>&lt;h3>2.11 Особые формы&lt;/h3>
В&amp;nbsp;отдельных случаях хочется заранее знать, как&amp;nbsp;и&amp;nbsp;когда будут аргументы вычислены. Поскольку эти&amp;nbsp;&amp;laquo;функции&amp;raquo; такие особые, то&amp;nbsp;и называются они&amp;nbsp;&amp;laquo;особые формы&amp;raquo;, вот&amp;nbsp;основные, которые нам&amp;nbsp;потребуются при&amp;nbsp;работе с&amp;nbsp;alterator.&lt;a name="h5141-7">&lt;/a>&lt;h4>2.11.1 Условные выражения&lt;/h4>
&lt;tt>(if условие команда-если-истина команда-если-ложь)&lt;/tt>&lt;br />
Сначала вычисляется условие, если оно&amp;nbsp;истинно (то есть не&amp;nbsp;&lt;tt>#f&lt;/tt>), то&amp;nbsp;вычисляется &lt;tt>команда-если-истина&lt;/tt>, иначе вычисляется &lt;tt>команда-если-ложь&lt;/tt>.&lt;br />
Например, &lt;br />
&lt;ul>&lt;li>&lt;tt>(if #f 3 4)&lt;/tt> &amp;ndash; вернёт &lt;tt>4&lt;/tt>
&lt;/li>&lt;li> &lt;tt> (if (+ 1 3) 5 6)&lt;/tt> &amp;ndash; вернёт &lt;tt>5&lt;/tt>, поскольку результат &lt;tt>(+ 1 3)&lt;/tt>, то&amp;nbsp;есть &lt;tt>4&lt;/tt> &amp;mdash; &amp;laquo;не ложь&amp;raquo;.
&lt;/li>&lt;li> &lt;tt>(if (string=? &amp;#8220;aaa&amp;#8221; &amp;#8220;bbb&amp;#8221;) 3 5)&lt;/tt> &amp;ndash; вернёт &lt;tt>5&lt;/tt>, ибо&amp;nbsp;строки не&amp;nbsp;равны
&lt;/li>&lt;li> &lt;tt>(if (number? 5) &amp;#8220;number&amp;#8221; &amp;#8220;not number&amp;#8221;)&lt;/tt> &amp;ndash; вернёт строку &lt;tt>&amp;#8220;number&amp;#8221;&lt;/tt>,  ибо&amp;nbsp;&lt;tt>5&lt;/tt> &amp;mdash; действительно число, а&amp;nbsp;не что&amp;nbsp;другое ;)
&lt;/li>&lt;li> &lt;tt>(if #f 3)&lt;/tt> &amp;ndash; поскольку &lt;tt>&amp;laquo;команда-если-ложь&amp;raquo;&lt;/tt> отсутствует, то&amp;nbsp;&lt;tt>if&lt;/tt> вернёт некоторое волшебную сущность, которую иногда называют unspecific, иногда unspecified  &amp;mdash; в&amp;nbsp;общем &amp;laquo;то, не&amp;nbsp;знаю что&amp;raquo;.&lt;/li>&lt;/ul>&lt;a name="h5141-8">&lt;/a>&lt;h4>2.11.2 Множественное ветвление&lt;/h4>
Если в&amp;nbsp;данной точке программы надо исследовать множество различных вариантов, то&amp;nbsp;используйте &lt;tt>cond&lt;/tt>&lt;br />
Формат: &lt;tt>(cond вариант1 вариант2 ... )&lt;/tt>&lt;br />
вариант &amp;ndash; оформляется в&amp;nbsp;виде &lt;tt>(тест выражение1 выражение2 ... )&lt;/tt>&lt;br />
есть ещё специальный вариант &lt;tt>(else выражение1 выражение2 ... )&lt;/tt>, который применяется, если никакой другой вариант не&amp;nbsp;прошёл. &lt;tt>else&lt;/tt> может остуствовать, и&amp;nbsp;должен быть всегда последним вариантом в&amp;nbsp;случае присутствия.&lt;br />
&lt;div class="indent">(cond&lt;br />
&lt;div class="indent">((string? x) &amp;laquo;строка&amp;raquo;)&lt;br />
((number? x) &amp;laquo;число&amp;raquo;)&lt;br />
((symbol? x) &amp;laquo;символ&amp;raquo;)&lt;br />
(else &amp;laquo;не знаю что&amp;nbsp;такое&amp;raquo;)))&lt;/div>&lt;/div>&lt;a name="h5141-9">&lt;/a>&lt;h4>2.11.3 последовательное исполнение&lt;/h4>
Иногда в&amp;nbsp;&lt;tt>if&lt;/tt> допустима только одна команда на&amp;nbsp;условие истины и&amp;nbsp;одна на&amp;nbsp;условие лжи. А&amp;nbsp;что делать если хочется исполнить сразу много команд в&amp;nbsp;случае некоторого условия? Иногда можно конечно обойтись имеющимися средствами, но&amp;nbsp;гораздо проще воспользоваться особой формой &lt;tt>begin&lt;/tt>, которая вычисляет свои аргументы строго последовательно слева направо. В&amp;nbsp;качестве результата возвращается результат работы последнего выражения.&lt;br />
Пример: &lt;br />
(begin (+ 1 2)&lt;br />
&lt;div class="indent">&lt;div class="indent"> (+ 3 4))&lt;/div>&lt;/div>
сначала сложит &lt;tt>1&lt;/tt> и&amp;nbsp;&lt;tt>2&lt;/tt>, потом сложит &lt;tt>3&lt;/tt> и&amp;nbsp;&lt;tt>4&lt;/tt> и&amp;nbsp;вернёт в&amp;nbsp;качестве результата &lt;tt>7&lt;/tt>.&lt;a name="h5141-10">&lt;/a>&lt;h3>2.12 Вернёмся к&amp;nbsp;alterator&lt;/h3>
 &amp;ndash; поля ввода (&lt;tt>edit&lt;/tt>)&lt;br />
 &amp;ndash; метки (&lt;tt>label&lt;/tt>)&lt;br />
 &amp;ndash; галки (&lt;tt>checkbox&lt;/tt>) &lt;em>(не знаю как&amp;nbsp;это сказать по-русски) &amp;mdash; inger@&lt;/em>&lt;br />
При&amp;nbsp;вводе чего-либо в&amp;nbsp;&lt;tt>edit&lt;/tt> метка получит текст &amp;#8220;something changed&amp;#8221;&lt;br />
&lt;tt>checkbox&lt;/tt> будет переключать режим отображения &lt;tt>edit&lt;/tt> &amp;ndash; нормальный и&amp;nbsp;звездочками (как при&amp;nbsp;вводе пароля).&lt;br />
Раздадим имена виджетам:&lt;br />
&lt;ul>&lt;li> edit &amp;ndash; editor
&lt;/li>&lt;li> label &amp;ndash; lbl&amp;nbsp;&lt;/li>&lt;li> checkbox &amp;ndash; setter.&lt;/li>&lt;/ul>
Если хотим узнать выставленна ли&amp;nbsp;галочка у&amp;nbsp;&lt;tt>checkbox&lt;/tt> по&amp;nbsp;имени &lt;tt>setter&lt;/tt>, переформулируем эту&amp;nbsp;фразу на&amp;nbsp;языке alterator следующим образом: &lt;tt>(setter checked)&lt;/tt>&lt;br />
В&amp;nbsp;результате получаем или&amp;nbsp;&lt;tt>#t&lt;/tt> или&amp;nbsp;&lt;tt>#f&lt;/tt>.&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">(on-change (lbl text &amp;#8220;something changed&amp;#8221;))&lt;br />
(on-return (lbl text &amp;#8220;enter pressed&amp;#8221;))))&lt;br />
&lt;div class="indent">&lt;div class="indent">(on-click (if (setter checked)&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">(editor echo stars)&lt;br />
(editor echo yes)))))&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Часть информации в&amp;nbsp;ней будет касаться alterator которого пока ещё нет&amp;nbsp;в&amp;nbsp;Сизифе, но&amp;nbsp;он скоро до&amp;nbsp;него доберётся.&lt;a name="h5141-1">&lt;/a>&lt;h2>2.10 Открываем капот.&lt;/h2>
Может быть из&amp;nbsp;академических соображений так&amp;nbsp;поступать не&amp;nbsp;стоит, однако иногда бывает проще рассказать про&amp;nbsp;причину, чем&amp;nbsp;про её следствия.&lt;br />
Давайте разберёмся с&amp;nbsp;тем как&amp;nbsp;работает интерпретатор Схемы, благо знания нам&amp;nbsp;уже это&amp;nbsp;позволяют сделать. После этого всё, что&amp;nbsp;было до&amp;nbsp;сего момента неясно, уже&amp;nbsp;станет очевидным.&lt;br />
 * прочитать очередное выражение&lt;br />
 * провести интерпретацию этого выражения&lt;br />
Если мы&amp;nbsp;находимся в&amp;nbsp;командном интерпретаторе, то&amp;nbsp;после последнего этапа ещё происходит печать получившегося выражения.&lt;br />
Вот&amp;nbsp;собственно и&amp;nbsp;всё! Теперь разберёмся с&amp;nbsp;каждым шагом. Как&amp;nbsp;и&amp;nbsp;многое другое процесс интерпретации разделён на&amp;nbsp;несколько отдельных функций, что&amp;nbsp;позволяет контролировать его&amp;nbsp;с&amp;nbsp;точностью до&amp;nbsp;миллиметра, если это&amp;nbsp;конечно надо.&lt;a name="h5141-2">&lt;/a>&lt;h3>2.10.1 Чтение&lt;/h3>
Прочитать выражение позволяет функция read. По-умолчанию, чтение происходит со&amp;nbsp;стандартного ввода. Глядя на&amp;nbsp;примеры выражений и&amp;nbsp;любовь языка к&amp;nbsp;списковым структурам в&amp;nbsp;круглых скобках не&amp;nbsp;сложно догадаться что&amp;nbsp;мы&amp;nbsp;получаем на&amp;nbsp;выходе из&amp;nbsp;read ... правильно именно списки и&amp;nbsp;получаем ну&amp;nbsp;или просто константы, если скобок не&amp;nbsp;было.&lt;br />
Первое &amp;ndash; константа &amp;ndash; число 3&lt;br />
Второе &amp;ndash; константа &amp;ndash; строка &amp;#8220;string&amp;#8221;&lt;br />
  &amp;mdash; символ '+' (вот они&amp;nbsp;символы-то! не&amp;nbsp;спроста они&amp;nbsp;в&amp;nbsp;языке существуют ;))&lt;br />
  &amp;mdash; число 1&lt;br />
  &amp;mdash; число 3&lt;br />
  &amp;mdash; константа &amp;ndash; символ some-func&lt;br />
  &amp;mdash; константа &amp;ndash; символ a&lt;br />
  &amp;mdash; константа &amp;ndash; логическая ложь.&lt;br />
  &amp;mdash; ещё один список из: символа + и&amp;nbsp;чисел 1 и&amp;nbsp;3.&lt;br />
Шестое &amp;ndash; символ a.&lt;a name="h5141-3">&lt;/a>&lt;h3>2.10.2 Исполнение&lt;/h3>
Исполнить полученный список, можно с&amp;nbsp;помощью функции eval, eval передаются два&amp;nbsp;параметра: список и&amp;nbsp;среда исполнения. Что-такое второй параметр не&amp;nbsp;будем пока заморачиваться, а&amp;nbsp;примем как&amp;nbsp;данность.&lt;br />
Исполнитель рекурсивно пробегается по&amp;nbsp;всем вложенным спискам, большинство констант интерпретируются в&amp;nbsp;них самих (строки в&amp;nbsp;строки, числа в&amp;nbsp;числа), а&amp;nbsp;вот наткнувшись на&amp;nbsp;символ, производится поиск соотв. переменной и&amp;nbsp;в результате подставляется то&amp;nbsp;на что&amp;nbsp;она ссылается (Note: здесь описана так&amp;nbsp;называемая подстановочная модель, она&amp;nbsp;не&amp;nbsp;точная зато, простая и&amp;nbsp;понятная, то&amp;nbsp;что происходит в&amp;nbsp;реальном интерпретаторе гораздо сложнее, но&amp;nbsp;суть остаётся примерно та&amp;nbsp;же)&lt;br />
После того как&amp;nbsp;все переменные разобраны, то&amp;nbsp;если в&amp;nbsp;результате остаётся  писок, то&amp;nbsp;происходит запуск функции. Первый элемент списка &amp;ndash; собственно &lt;br />
указатель на&amp;nbsp;саму функцию, например в&amp;nbsp;одном из&amp;nbsp;наших примеров &amp;ndash; это&amp;nbsp;стандартная функция string-append, а&amp;nbsp;все оставшиеся &amp;ndash; это&amp;nbsp;аргументы функции.&lt;br />
Вычисляем указанную функцию от&amp;nbsp;данных аргументов (в том&amp;nbsp;же&amp;nbsp;примере &amp;ndash; это&amp;nbsp;две константные строки &amp;#8220;str1&amp;#8221; и&amp;nbsp;&amp;#8220;str2&amp;#8221;) ... и&amp;nbsp;получаем результат исполнения.&lt;br />
3 &lt;s>&amp;gt; собственно 3 и&amp;nbsp;получим, никаких функций запускать не&amp;nbsp;надо&lt;br />
&amp;#8220;string&amp;#8221; --&amp;gt; получим строку&lt;br />
(+ 1 3) --&amp;gt; выполним функцию сложения от&amp;nbsp;аргументов 1 и&amp;nbsp;3, результат &amp;ndash; число 4.&lt;br />
(string-append &amp;#8220;str1&amp;#8221; &amp;#8220;str2&amp;#8221;) &amp;ndash; результат &amp;ndash; строка &amp;#8220;str1str2&amp;#8221;&lt;br />
(some-func a&amp;nbsp;#t (+ 1 3)) &amp;ndash; получим результат выполнения функцию от&amp;nbsp;аргументов:&lt;br />
 &lt;/s> значение переменной a&lt;br />
 -- лочическая ложь&lt;br />
 -- результат сложения 1 и&amp;nbsp;3, то&amp;nbsp;есть аргумент равен 4.&lt;br />
a&amp;nbsp;--&amp;gt; Значение переменной a&lt;a name="h5141-4">&lt;/a>&lt;h3>2.10.3 Вывод результата на&amp;nbsp;экран&lt;/h3>
Для&amp;nbsp;вывода результата на&amp;nbsp;экран есть множество функций, самая интересная из&amp;nbsp;них это, пожалуй, write.&lt;br />
Если в&amp;nbsp;результате вы&amp;nbsp;получили простую структуру, соcтоящую из&amp;nbsp;списков, возможно вложенных и&amp;nbsp;каких-либо констант(строк, чисел, символов), то&amp;nbsp;write&lt;br />
напечатает их&amp;nbsp;в таком виде, что&amp;nbsp;потом read может их&amp;nbsp;обратно съесть.&lt;br />
7 напечатается как&amp;nbsp;7&lt;br />
&amp;#8220;str&amp;#8221; напечатается как&amp;nbsp;&amp;#8220;str&amp;#8221;&lt;br />
Списки опять напечатаются как&amp;nbsp;знакомые выражения, окруженные скобками, например список из&amp;nbsp;1 2 и&amp;nbsp;3 будет напечатан как&amp;nbsp;(1 2 3)&lt;a name="h5141-5">&lt;/a>&lt;h3>2.10.4&lt;/h3>
Ну&amp;nbsp;а теперь повторим пройдённое. Помните про&amp;nbsp;функцию quote, которая позволяла заполучить символы? quote просто напросто говорит интерпретатору, что&amp;nbsp;не&amp;nbsp;надо исполнять eval после read.&lt;br />
Поэтому 'a &amp;ndash; это&amp;nbsp;просто символ a&lt;br />
'(1 2 3) &amp;ndash; это&amp;nbsp;список из&amp;nbsp;1 2 3&lt;a name="h5141-6">&lt;/a>&lt;h2>2.11 Особые формы&lt;/h2>
В&amp;nbsp;отдельных случаях хочется заранее знать как&amp;nbsp;и&amp;nbsp;когда будут аргументы вычислены. Поскольку эти&amp;nbsp;&amp;laquo;функции&amp;raquo; такие особые, то&amp;nbsp;и называются они&amp;nbsp;&amp;laquo;особые формы&amp;raquo;, вот&amp;nbsp;основные, которые нам&amp;nbsp;потребуются при&amp;nbsp;работе с&amp;nbsp;alterator.&lt;a name="h5141-7">&lt;/a>&lt;h3>2.11.1 Условные выражения&lt;/h3>
(if условие команда-если-истина команда-если-ложь)&lt;br />
Сначала вычисляется условие, если оно&amp;nbsp;истинно (то есть не&amp;nbsp;#f), то&amp;nbsp;вычисляется &amp;laquo;команда-если-истина&amp;raquo;, иначе вычисляется &amp;laquo;команда-если-ложь&amp;raquo;.&lt;br />
Например (if #f 3 4) &amp;ndash; вернёт 4&lt;br />
         (if (+ 1 3) 5 6) &amp;ndash; вернёт 5, поскольку результат (+ 1 3), то&amp;nbsp;есть&lt;br />
         4 &amp;laquo;не ложь&amp;raquo;.&lt;br />
         (if (string=? &amp;#8220;aaa&amp;#8221; &amp;#8220;bbb&amp;#8221;) 3 5) &amp;ndash; вернёт 5 ибо&amp;nbsp;строки не&amp;nbsp;равны&lt;br />
         (if (number? 5) &amp;#8220;number&amp;#8221; &amp;#8220;not number&amp;#8221;) &amp;ndash; вернёт строку &amp;#8220;number&amp;#8221;&lt;br />
         ибо&amp;nbsp;5 действительно число, а&amp;nbsp;не что&amp;nbsp;другое ;)&lt;br />
         (if #f 3) &amp;ndash; поскольку &amp;laquo;команда-если-ложь&amp;raquo; отсутствует, то&amp;nbsp;if&lt;br />
         вернёт некоторое волшебную сущность, которую иногда называют&lt;br />
         unspecific, иногда unspecified  в общем &amp;laquo;то не&amp;nbsp;знаю что&amp;raquo;.&lt;a name="h5141-8">&lt;/a>&lt;h3>2.11.2 Множественное ветвление&lt;/h3>
Если в&amp;nbsp;данной точке программы надо исследовать множество различных вариантов, то&amp;nbsp;используйте cond&lt;br />
Формат: (cond вариант1 вариант2 ... )&lt;br />
вариант &amp;ndash; оформляется в&amp;nbsp;виде (тест выражение1 выражение2 ... )&lt;br />
есть ещё специальный вариант (else выражение1 выражение2 ... ) который применяется если никакой другой вариант не&amp;nbsp;прошёл. else может остуствовать, и&amp;nbsp;должен быть всегда последним вариантом в&amp;nbsp;случае присутствия.&lt;br />
  (cond&lt;br />
    ((string? x) &amp;laquo;строка&amp;raquo;)&lt;br />
    ((number? x) &amp;laquo;число&amp;raquo;)&lt;br />
    ((symbol? x) &amp;laquo;символ&amp;raquo;)&lt;br />
    (else &amp;laquo;не знаю что&amp;nbsp;такое&amp;raquo;)))&lt;a name="h5141-9">&lt;/a>&lt;h2>2.11.3 последовательное исполнение&lt;/h2>
Иногда в&amp;nbsp;if допустима только одна команда на&amp;nbsp;условие истины и&amp;nbsp;одна на&amp;nbsp;условие лжи. А&amp;nbsp;что делать если хочется исполнить сразу много команд в&amp;nbsp;случае некоторого условия? Иногда можно конечно обойтись имеющимися средствами, но&amp;nbsp;гораздо проще воспользоваться особой формой begin, которая вычисляет свои аргументы строго последовательно слева направо. В&amp;nbsp;качестве результата возвращается результат работы последнего выражения.&lt;br />
Пример: (begin (+ 1 2)&lt;br />
               (+ 3 4))&lt;br />
Сначала сложит 1 и&amp;nbsp;2, потом сложит 3 и&amp;nbsp;4 и&amp;nbsp;вернёт в&amp;nbsp;качестве результата 7.&lt;a name="h5141-10">&lt;/a>&lt;h2>2.12 Вернёмся к&amp;nbsp;alterator&lt;/h2>
 - поля ввода (edit)&lt;br />
 - метки (label)&lt;br />
 - checkbox (не знаю как&amp;nbsp;это сказать по-русски)&lt;br />
При&amp;nbsp;вводе чего-либо в&amp;nbsp;edit метка получит текст &amp;#8220;something changed&amp;#8221;&lt;br />
checkbox будет переключать режим отображения edit &amp;ndash; нормальный и&amp;nbsp;звездочками (как при&amp;nbsp;вводе пароля).&lt;br />
Раздадим имена виджетам: edit &amp;ndash; editor&lt;br />
                         label &amp;ndash; lbl&lt;br />
                         checkbox &amp;ndash; setter.&lt;br />
Если хотим узнать выставленна ли&amp;nbsp;галочка у&amp;nbsp;checkbox по&amp;nbsp;именни setter, переформулируем эту&amp;nbsp;фразу на&amp;nbsp;языке alterator следующим образом: (setter checked)&lt;br />
В&amp;nbsp;результате получаем или&amp;nbsp;#t или&amp;nbsp;#f.&lt;br />
                  (on-change (lbl text &amp;#8220;something changed&amp;#8221;))&lt;br />
                  (on-return (lbl text &amp;#8220;enter pressed&amp;#8221;))))&lt;br />
                      (on-click (if (setter checked)&lt;br />
                                  (editor echo stars)&lt;br />
                                  (editor echo yes)))))&lt;/div>&lt;/div>
</description>
</item>
</channel>
</rss>
