<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Блоги: заметки с тегом postscript</title>
<link>https://blogengine.me/blogs/tags/postscript/</link>
<description>Автоматически собираемая лента заметок, написанных в блогах на Эгее</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.0 (v4079e)</generator>

<itunes:subtitle>Автоматически собираемая лента заметок, написанных в блогах на Эгее</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>Особенность языка Postscript</title>
<guid isPermaLink="false">132563</guid>
<link>https://bolknote.ru/all/osobennost-yazyka-postscript/</link>
<pubDate>Sat, 10 Mar 2018 13:12:43 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/osobennost-yazyka-postscript/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Есть вы вдруг заинтересовались и прочитали программу «&lt;a href="//bolknote.ru/all/99-butylok-postscript/"&gt;99 бутылок&lt;/a&gt;» на Постскрипте, то даже при полном незнании языка, примерно понятно где у него аналоги функций, блоков, ветвлений и прочих сущностей.&lt;/p&gt;
&lt;p&gt;Единственная конструкция, которая должна смущать, это место, где происходит печать числа:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;% печать числа
//=string cvs print&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Дело в том, что операторы &lt;i&gt;show&lt;/i&gt; и &lt;i&gt;print&lt;/i&gt;, принимают на вход только строку, поэтому число на входе надо преобразовать. Для этого используется оператор &lt;i&gt;cvs&lt;/i&gt;, на мой взгляд очень странный — он требует не один, как можно было бы ожидать, а два параметра — число, которое будет преобразовано и строку, которую оператор снимет со стека и положит вместо неё преобразованное в строку число. Причём по размеру строка должна быть не короче, чем строковое представление числа, которое мы надеемся преобразовать. Иначе мы получим ошибку «&lt;i&gt;rangecheck&lt;/i&gt;». Видимо строковый параметр используется как какой-то буфер.&lt;/p&gt;
&lt;p&gt;Чаще всего &lt;i&gt;cvs&lt;/i&gt; используется так (правда это прямо запрещено &lt;a href="http://www.ghostscript.com/doc/current/Ps-style.htm"&gt;стилем кодирования Постскрипта&lt;/a&gt;, рекомендуется использовать не готовую строку, а формировать пустую строку оператором &lt;i&gt;string&lt;/i&gt;, но всё равно широко встречается):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;% печать числа 42
42 (  ) cvs print&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Кладём на стек «42», потом строку из двух пробелов (скобки задают строку в Постскрипте), далее вызываем &lt;i&gt;cvs&lt;/i&gt;, которая берёт со стека два значения, работает с ними и кладёт обратно строку, содержащую преобразованное число, &lt;i&gt;print&lt;/i&gt; берёт значение со стека и выводит в консоль.&lt;/p&gt;
&lt;p&gt;Но если места нужно много, нередко используют оператор &lt;i&gt;=string&lt;/i&gt;, который кладёт на стек буфер в 128 байт, его хватит всем — таких больших числе в языке нет, любое гарантированно поместится:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;% печать числа 10000000000, cvi нужно, чтобы преобразовать плавающее 1e+10 в целое
1e+10 cvi =string cvs print&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Пока, надеюсь, всё просто и понятно. Далее надо знать такую вещь. Конструкция «{…}» кладёт на стек специальный тип — исполняемый блок, посмотрим как он выглядит на стеке:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;% посмотрим как выглядит исполняемый блок на стеке:
{1e+10 cvi =string cvs print} ==
% выведет {1e+10 cvi =string cvs print}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Оператор «два равно» берёт значение со стека и выводит его на экран. Как видим блок попал на стек в неизменном виде. И вот тут можно сделать микрооптимизацию — если этот кусок кода кладётся не на стек, а в словарь (можно считать, что будет создана именованная функция) и мы рассчитываем вызвать его несколько раз, вызов &lt;i&gt;=string&lt;/i&gt; можно сразу раскрыть в строку — это делается двумя слешами.&lt;/p&gt;
&lt;p&gt;Два слеша — специальная конструкция, которая похожа на вызов анонимной функции по месту определения, в данном случае мы выполняем ровно один оператор и на стеке внутри блока кода мы увидим не вызов, а порождённую им строку:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;{1e+10 cvi //=string cvs print} ==
% выведет {1e+10 cvi (x255Unicode\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000...) cvs print}&lt;/code&gt;&lt;/pre&gt;</description>
</item>


</channel>
</rss>