{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом postscript",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.me\/blogs\/tags\/postscript\/",
    "feed_url": "https:\/\/blogengine.me\/blogs\/tags\/postscript\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.me\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "132563",
            "url": "https:\/\/bolknote.ru\/all\/osobennost-yazyka-postscript\/",
            "title": "Особенность языка Postscript",
            "content_html": "<p>Есть вы вдруг заинтересовались и прочитали программу «<a href=\"\/\/bolknote.ru\/all\/99-butylok-postscript\/\">99 бутылок<\/a>» на Постскрипте, то даже при полном незнании языка, примерно понятно где у него аналоги функций, блоков, ветвлений и прочих сущностей.<\/p>\n<p>Единственная конструкция, которая должна смущать, это место, где происходит печать числа:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">% печать числа\n\/\/=string cvs print<\/code><\/pre><p>Дело в том, что операторы <i>show<\/i> и <i>print<\/i>, принимают на вход только строку, поэтому число на входе надо преобразовать. Для этого используется оператор <i>cvs<\/i>, на мой взгляд очень странный — он требует не один, как можно было бы ожидать, а два параметра — число, которое будет преобразовано и строку, которую оператор снимет со стека и положит вместо неё преобразованное в строку число. Причём по размеру строка должна быть не короче, чем строковое представление числа, которое мы надеемся преобразовать. Иначе мы получим ошибку «<i>rangecheck<\/i>». Видимо строковый параметр используется как какой-то буфер.<\/p>\n<p>Чаще всего <i>cvs<\/i> используется так (правда это прямо запрещено <a href=\"http:\/\/www.ghostscript.com\/doc\/current\/Ps-style.htm\">стилем кодирования Постскрипта<\/a>, рекомендуется использовать не готовую строку, а формировать пустую строку оператором <i>string<\/i>, но всё равно широко встречается):<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">% печать числа 42\n42 (  ) cvs print<\/code><\/pre><p>Кладём на стек «42», потом строку из двух пробелов (скобки задают строку в Постскрипте), далее вызываем <i>cvs<\/i>, которая берёт со стека два значения, работает с ними и кладёт обратно строку, содержащую преобразованное число, <i>print<\/i> берёт значение со стека и выводит в консоль.<\/p>\n<p>Но если места нужно много, нередко используют оператор <i>=string<\/i>, который кладёт на стек буфер в 128 байт, его хватит всем — таких больших числе в языке нет, любое гарантированно поместится:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">% печать числа 10000000000, cvi нужно, чтобы преобразовать плавающее 1e+10 в целое\n1e+10 cvi =string cvs print<\/code><\/pre><p>Пока, надеюсь, всё просто и понятно. Далее надо знать такую вещь. Конструкция «{…}» кладёт на стек специальный тип — исполняемый блок, посмотрим как он выглядит на стеке:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">% посмотрим как выглядит исполняемый блок на стеке:\n{1e+10 cvi =string cvs print} ==\n% выведет {1e+10 cvi =string cvs print}<\/code><\/pre><p>Оператор «два равно» берёт значение со стека и выводит его на экран. Как видим блок попал на стек в неизменном виде. И вот тут можно сделать микрооптимизацию — если этот кусок кода кладётся не на стек, а в словарь (можно считать, что будет создана именованная функция) и мы рассчитываем вызвать его несколько раз, вызов <i>=string<\/i> можно сразу раскрыть в строку — это делается двумя слешами.<\/p>\n<p>Два слеша — специальная конструкция, которая похожа на вызов анонимной функции по месту определения, в данном случае мы выполняем ровно один оператор и на стеке внутри блока кода мы увидим не вызов, а порождённую им строку:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">{1e+10 cvi \/\/=string cvs print} ==\n% выведет {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}<\/code><\/pre>",
            "date_published": "2018-03-10T13:12:43+05:00",
            "date_modified": "2024-11-05T13:11:44+05:00",
            "tags": [
                "postscript",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Sat, 10 Mar 2018 13:12:43 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "132563",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}