Литературное программирование, часть 1
Nov. 17th, 2009 10:05 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Кнут придумал литературное программирование в начале 1980-х годов, во время работы над TeX-ом. Надо сказать, что первую версию TeX-а он написал и отладил на бумаге, а ввёл в компьютер лишь спустя несколько месяцев.
Понятно, что для успеха такой разработки код должно быть легко читать. Вообще читаемость кода, по мнению многих опытных разработчиков - это главное, что сейчас требуется от программистов.
Кнут предложил довести требование читаемости кода до предела и превратить написание программы в написание книги об этой программе. При этом код и документация не разделяются, они описывают решение проблемы формально и неформально. Естественно, что логика изложения может отличаться от последовательности команд. Кроме того, текст должен быть представлен в удобном для читателя виде. Поэтому нужны специальные инструменты, которые позволяют смешивать разметку текста и код.
Кнут, вполне естественно, предложил для текста TeX. Кроме того, в тот момент он использовал язык программирования Pascal, строгость которого усугубляется требованием однопроходной компиляции. Из-за этого порядок определения функций, типов и переменных строго фиксирован, что противоречит требованию понятности изложения. Так что Дональду Кнуту пришлось написать свою систему WEB, которая устроена примерно так. Программа состоит из кусочков (chunks)документации, чередующихся с кусочками кода. В кусочках кода можно ссылаться на другие кусочки, причем ссылки могут идти и вперед, и назад, а на один кусочек может быть несколько ссылок. Получается своего рода сеть, отсюда и название, которое потом использовали для похожей структуры документов в интернет.
Чтобы такую программу можно было использовать, есть две утилиты - tangle, которая вытаскивает кусочки кода, подставляет их на место ссылок и формирует программу, которую можно скомпилировать, и weave , которая форматирует кусочки кода командами TeX и создает документ TeX, который можно распечатать.
TeX и написан таким образом, а человеко-читаемая версия вышла в виде книги "TeX: The program".
Кстати, чтобы получить эту книгу в электронном виде, достаточно скачать исходный код TeX и выполнить следующие команды:
weave tex.web
tex tex.tex
xdvi tex.dvi
или
pdftex tex.tex
xpdf tex.pdf
Потом Кнут перешёл на язык C (который он хвалил в своём интервью, см. предыдущий пост ) и написал CWEB. Возникли и другие инструменты, например, noweb, nuweb, rambutan и другие.
Литературное программирование пока не достигло большой популярности, хотя многие опытные программисты и считают его хорошей идеей. Причина этого в том, что немногие люди умеют и любят писать.
Сам Дональд Кнут в своем интервью в книге описал ситуацию следующим образом, сославшись на Джона Бентли:
"[Т]олько два процента людей могут быть программистами. И только два процента могут быть хорошими писателями. А Кнут хочет чтобы все сочетали эти качества."
Я не думаю, что количество программистов в мире когда-нибудь превысит два процента - я имею в виду программистов, которые действительно способны находить общий язык с машиной от рождения. Однако теперь люди ведут блоги. Поэтому я заметил, что в среднем способность выражать свои мысли сильно растет, поэтому второй аргумент уже не имеет такого значения.
То есть ситуация улучшается благодаря всеобщему увлечению блогами. Программисты начали писать про программирование и иногда получается очень интересно, например у Джоэла Спольски (Joel on software) или у Стива Йегги (Steve Yeggae и тут). Так что литератуное программирование, возможно, ещё достигнет популярности.
Литературные программы, ориентированные на то, что их будут читать люди, хорошо подходят как для сопровождения в течении длительного времени, так и для совместной работы и обучения. Мне кажется, что литературное программирование в этом смыкается с OpenSource-движением. Для совместной работы над кодом существует масса сервисов, начиная от систем управления версиями (и социальных сайтов типа github на их основе) и заканчивая различными pastebin-ами (paste.lisp.org, pastebin.org и т.д.).
Поэтому мне было приятно обнаружить сайт, посвященный совместной работе над литературной реализацией различных алгоритмов на разных языках. Мне кажется, что этот сайт literateprograms.org может быть хорошим подспорьем при изучении новых языков программирования.
В следующем посте этой серии я расскажу о некоторых инструментах для литературного программирования, их достоинствах и недостатках и покажу, какие получаются красивые программы.
no subject
Date: 2009-11-17 08:05 pm (UTC)Мне даже комментировать стыдно :-)
no subject
Date: 2009-11-17 08:42 pm (UTC)Но лучше всё-таки прокомментируй :)
Наверняка найдётся что добавить или за что покритиковать.
Хотя бы за то, что пост не провоцирует комментирование ;-)
no subject
Date: 2009-11-17 09:30 pm (UTC)no subject
Date: 2009-11-17 09:57 pm (UTC)Кстати, смотри как прикольно - объектная система на Scheme всего в 50 строчек: http://github.com/naa/Articles/blob/master/AffineLieAlgebras/SchemePrograms/LispMeObjects.scm
Работает и на Palm-е, и на PC, причём в разных реализациях Scheme.
Или ты по-прежнему настаиваешь на монадах?! :)
Newlisp
Date: 2009-11-17 10:22 pm (UTC)Scheme - хороший язык, да. Есть один минималистский лисп, www.newlisp.org, сделанный немцем живущим в США Lutz Mueller'ом. На любой платформе, одна программка <250кб размером. Больше 300 операторов, покрывают практически все, что надо. Прямая работа с библиотеками на Си. Сам язык - скриптовый, быстрый и т.д. Он однако позволяет "привязывать" ваш скрипт к самому исполняемому файлу-языку. Получается псевдо-монолитная программа 250к+размер вашего скрипта, приблизительно говоря.
Автор в него встроил "контексты" (на основе black-red trees, т.е. "hashes"), весьма интересный минималистский инструмент сам по себе.
Рекомендую.
Re: Newlisp
Date: 2009-11-17 10:47 pm (UTC)Вообще всяких lisp-ов много. Вот, например, сейчас Clojure (http://clojure.org/) активно развивается, а ещё arc (http://arclanguage.org/) есть, там даже online-REPL дают: http://dabuttonfactory.com:8080/ .
Просто Scheme - один из двух "стандартных" диалектов и есть для всех платформ, включая старые Palm-ы, Pocket PC и всякие микроконтроллеры. Я с программками на Scheme в транспорте играюсь.
no subject
Date: 2009-11-17 10:23 pm (UTC)Это какие-то структуры. Так и С объектный язык, что ли? Все это зачем-то нужно?
BTW, Haskell type class и таких "объектов" нам не надо!
no subject
Date: 2009-11-17 10:25 pm (UTC)no subject
Date: 2009-11-17 11:03 pm (UTC)no subject
Date: 2009-11-17 11:12 pm (UTC)Про написать язык это, кажется, свойство всех функциональных языков, имеющих поддержку.
А что за математической библиотеки ты хочешь в Haskell? В смысле, чего тебе не хватает?
no subject
Date: 2009-11-18 12:05 am (UTC)Кроме того, библиотеки для линейной алгебры тоже как-то странно выглядят - если использовать враппер вокруг CLAPACK, то зачем нам вообще мощный функциональный язык с системой типов?
То есть библиотеки для линейной алгебры какие-то неготовые - их несколько и нет одной "стандартной", хотя HMatrix (http://hackage.haskell.org/cgi-bin/hackage-scripts/package/hmatrix) вроде бы не плоха, но она появилась чуть ли не в 2008 году, то есть совсем недавно.
no subject
Date: 2009-11-18 12:08 pm (UTC)2)Под !не работает! ты имеешь в виду !не работает на нераспространенных платформах! ?
3)Я может ересь скажу, но для линейки лучше биндинги с GPU-шными библиотеками налаживать, вот уж где линейка работает быстро и почти безглючно. С другой стороны, в palm и во многих других девайсах подобные вещи появятся не скоро, если вообще появятся.
У нас с тобой разные требования. Мне не так важно, чтобы мои программы работали на каких-то платформах, кроме тех, на которых работаю я. Результат намного важнее самой программы. Хотя я бы не отказался от программирования на haskell под айфон, но пока все что видел либо слишком сложно в установке и происходят в процессе вещи, которые нигде не описаны, либо просто вылетает при запуске без объяснения причин.
no subject
Date: 2009-11-18 01:08 pm (UTC)У меня есть кусок кода на Maple, в котором выражены всякие алгебраические вещи, которыми я занимаюсь. Он выглядит ужасно, так как Maple довольно кривой язык, в котором сложно выражать новые абстракции. Я думал переписать этот код на каком-то другом языке, но от переписывания на Haskell пока отказался из-за упомянутых сложностей. Ведь из-за них этим кодом вряд ли сможет воспользоваться кто-то кроме меня и даже мне будет трудно на других машинах, так как придётся доустанавливать какие-то билиотеки и т.п. Вот сейчас думаю про Математику, она вроде лучше Maple как язык и вообще на Lisp похожа.
Насчёт проблем с платформами ты уже и сам отписался, у меня были некоторые трудности со сборкой ghc на машине с OpenSUSE 10.2 без прав рута (это совсем не старый дистрибутив, но тем не менее).
Под не работает по отношению к NumericPrelude я имел в виду, что если использовать эту библиотеку, то сломаются все остальные, то есть я окажусь с более хорошими числами, но без линейной алгебры.
no subject
Date: 2009-11-18 02:49 pm (UTC)Народ вычислительные вещи все-таки на plain C пишет, наверное. Благо и библиотек достаточно. А лучше всего Intel C compiler + Intel Math Library, работает понятно на каких платформах, но рулит по скорости безмерно (интересно, что иногда на бинарник ругается мой антивирусник). А если еще и Intel Parallel Studio заюзать... Но это все около 2К$ стоит, хотя и вполне оправдывает цену. Делаешь библиотеку с нужным тебе вычислительным ядром и после этого пишешь GUI на каком-нибудь Qt -- супер!
Вот с NumPy у меня схожая ситуация, что у тебя с Numeric в Haskell. Мне NumPy был нужен исключительно для установки Biopython'а, версию поставил из списка совместимых. Очень часто эксепшены появляются в части, которая юзает NumPy. Моей квалификации не хватает, чтобы понять что именно не так, но вот с точки зрения пользователя Biopython, NumPy -- зло.
Matlab из твоего списка наиболее мощный инструмент, пожалуй, тут я не спорю. И вывод нативный -- картинки рисовать и работает всё из коробки. И, пожалуй, да, это самое эффективный инструмент для сложных расчетов, тем более алгебраических, с точки зрения продуктивности программиста и отладки. Но если ты хочешь писать инструмент, требующий некой не банальной интерактивности, то он не подойдет.
no subject
Date: 2009-11-17 10:59 pm (UTC)Естественно, что на C можно писать объектно-ориентированный код - взять хоть тот же GTK+.
Тут довольно забавно получается, вполне похоже на человеческое ООП в духе SmallTalk:
Зачем нужно - очевидно, чтобы поиграться =). Я, например, на досуге пишу программку, чтобы на Palm-е всякие картиночки с корневыми/весовыми диаграммами для разных алгебр рисовать.
А Haskell - это хорошо, конечно, только он меня слегка разочаровал отсутствием стандартной математической библиотеки и тем, что с трудом заводится на разных платформах.
no subject
Date: 2009-11-22 11:36 am (UTC)Есть у меня ощущение, что литературное программирование может быть оправдано только для очень больших кодов с нетривиальными алгоритмами (я то с примитивными программами работаю. Даже комментировать в них почти нечего :-) ). И, кстати, не затрудняет ли оно разделение программ на части, которые проще отладить по отдельности?
возьмите пример
Date: 2009-11-22 04:26 pm (UTC)http://github.com/unixtechie/Literate-Molly/
и даже особо не читая его, пролистайте третью часть, где код.
По-моему, ЛП собой _заменяет_ деление на функции и подпрограммы там, где
это нужно лишь программисту чтобы не потерять нить (и если он этого хочет,
разумеется его никто не заставляет перестать оформлять куски как подпрограммы)
Вообще, ЛП - с одной стороны есть просто средство управления вниманием.
Так можно писать хоть роман с продолжениями.
С другой оно - "написание точных программ, отталкиваясь от спецификаций
на человеческом языке произвольными фразами". Т.е. написание программ
на сколь угодно вложенном псевдокоде, где произвольные объясняющие фразы
превращаются в точные операторы мета-языка. Когда вы tangle программу, они раскроются в операторы этого машинного языка.
Пролистайте мой код, читая MOLLY.html - а затем просмотрите тот код, который
программа из него извлекает, MOLLY.pl
Для отладки в таком ЛП существует несколько очевидных приемов.
--1-- складной ЛП-файл (впрочем, и традиционный, просто там этим реже пользуются) может включать в себя сколько угодно реальный файлов с кодом.
Поэтому я могу просто открыть подраздел, в нем написать тест, взять его
из Лит_исходника командой
и его попробовать
Я могу держать в лит-исходнике сколько угодно тестов, мейкфайлы и т.д. в
поддержку основного проекта. И могу держать также несколько файлов проекта
в одном лит-исходнике, например, "prog.c" и "prog.h"
--2-- лит-программирование позволяет _добавлять_ к уже существующему куску текста в любом месте далее вниз.
Т.е. я пишу:
<<секция раз>>=
код-код-код
@
много объяснений.
Другой раздел
Теперь мы добавим новую функциональность поверх уже работающей основы.
<<секция раз>>=
новые строчки
@
Для машины же они будут положены в то место, где "секция раз" была начата.
Это первый приём изменения порядка следования, от машинного к тому, как хочется человеку по смыслу.
Второй в том, что сами куски "секция раз" могут писаться в произвольном порядке, а попадут в код точно в том месте, где на них сослались:
--3--Далее, если у меня есть не внешний тест-файл кусок, который
я хочу менять, а это рисковано, потому что до сих пор все работало, я просто, никак не оформляя его в "подпрограмму" или "функцию", вырезаю его и вставляю на его место копию, которую буду портить. Вот так:
Понятно, что делать такие обходы и откаты чрезвычайно легко,
никаких синтаксических ошибок не насажаешь, все куски можно оставлять
в лит-исходнике, а в моем складном они просто идут в подраздел, которого
НЕ ВИДИШЬ ВООБЩЕ, пока не надо.
Вообще вся идея моего расширения со складным ХТМЛ в том, что у вас может
быть 20 мегабайт кода, но читать вы будете только 5 логически нужных вам для работы сейчас страниц. Остальное для вас просто невидимо. Оно сложено.
-----------
В традиционном Лит-прог всё описанное возможно технически, но сами файлы - "плоские", в них всё идет подряд, а потому человеку, даже работающему в редакторе со "складыванием" (вроде emacs, vim и т.д.), всё равно надо держать в голове всю структуру лит-файла.
Я в Molly убрал эту нагрузку с программиста.
так что по-моему писать программы таким образом, расписывая фразами что вы хотите, потом - каждая строчка становится точным оператором моей программы, уже наполовину написанной не на машинной а на человеческом - проще, и отлаживать проще, и в один файл можно напихать всё, что вам надо для проекта, куски, тесты, ссылки, не плодя в рабочей директории тонн мусора.
Просмотрите MOLLY.html Когда будете его читать, держите включенным JavaScript в браузере.
Да, пункт 2, отвечает на ваш вопрос ...
Date: 2009-11-22 04:33 pm (UTC)Потому что литпрог - В ПОРЯДКЕ МЫСЛИ, а не в порядке машины, ради которой я должен изгибать мысль.
Пример в MOLLY.html - раздел 3, с кодом, в конце есть "ADD-ON" с добавкой
дополнительного языка разметки (т.е. док-секции можно размечать хтмл-ом, дефолт, но можно ма каком-нибудь маркдауне и т.д.)
не только я выделил кусок вне порядка следования, "по логике", но и из ничего, никаких подпрограмм или изменений кода, такой раздел даст пользователям место и точную инструкцию куда вставить свой кусок кода с их разметкой.
Т.е. создал полу-интерфейс для вставления плагинов, ничего не меняя в коде.
Другими словами, возможность держать "мета-язык" с произвольным порядком следования кусков, дает новые возможности и может отчасти заменять деление на функции и подпрограммы, которые программисты делают не из-за вычислительных нужд, а просто чтобы не сойти с ума.
По-моему, очень удобно.
Re: Да, пункт 2, отвечает на ваш вопрос ...
Date: 2009-11-22 05:01 pm (UTC)Постараюсь посмотреть-разобраться.
Главное преимущество лит. программирования я вроде понял. Действительно интересный подход и, при наличии привычки, должно быть удобно.
ишу документацию потому ..
Date: 2009-11-22 06:38 pm (UTC)использую ваши вопросы чтобы понять, что вообще объяснять надо ;))
Давайте я воспроизведу один комментарий, который написан без выдумки, его
надо литературно подправить, но в которм автор пытался обЪяснить подход
на не-программном примере
Если бы целью вашей была не программа, а роман или статья-эссе, то "писать на ЛП"
означало бы писать примерно так:
И на самом деле так можно писать любые тексты, например журналистскую статью, в которой
есть некая последовательная мысль, а отдельные куски или неизвестные сразу факты
разрабатываются и добавляются позже.
ЛП - метод организации мыслей и придания тексту структуры на мета-уровне, на основе неких
фраз, скрывающих за собой любой "оконечный код" или любые подобые абстракции.
Пре-процессор их автоматически подставит и развернет все в нужной последовательности
Кстати часто думают, что ЛП - это жирные комментарии. Как можно больше текста.
Как видите в последнем примере ВООБЩЕ НЕТ НИ ОДНОГО КОММЕНТАРИЯ, и вместе с тем это
"программа на ЛП": она написана на "псевдокоде", т.е. с использованием макро, которые
становятся точными операторами мета-языка.
Т.е. ЛП в нормальном случае связан с текстом (который объясняет концепции и идеи кода),
но сама техника введения макро вместо кропотливых кусков чтобы теми кусками заняться в
их очередь и избавить мозг от нагрузки по ведению учета и контроля тысячи мыслей -- то
есть для того, чтобы в конечном счете СТАТЬ УМНЕЕ за счет механизма абстрагирования --
эта техника возможна и совершенно без комментариев.
Которые почему-то все настаивают есть не заметки в помощь программисту, а некая "документация"
якобы для посторонних людей.
Нет, запись мыслей ПОМОЖЕТ и будет служить документацией идей, да. Но создается это не для
Идеального Читателя васи, а для себя в момент программирования.
BROKEN
Date: 2009-11-22 06:40 pm (UTC)Explanation - 1
Date: 2009-11-22 06:44 pm (UTC)означало бы писать примерно так:
И на самом деле так можно писать любые тексты, например журналистскую статью, в которой
есть некая последовательная мысль, а отдельные куски или неизвестные сразу факты
разрабатываются и добавляются позже.
ЛП - метод организации мыслей и придания тексту структуры на мета-уровне, на основе неких
фраз, скрывающих за собой любой "оконечный код" или любые подобые абстракции.
Пре-процессор их автоматически подставит и развернет все в нужной последовательности
Кстати часто думают, что ЛП - это жирные комментарии. Как можно больше текста.
Как видите в последнем примере ВООБЩЕ НЕТ НИ ОДНОГО КОММЕНТАРИЯ, и вместе с тем это
"программа на ЛП": она написана на "псевдокоде", т.е. с использованием макро, которые
становятся точными операторами мета-языка.
Т.е. ЛП в нормальном случае связан с текстом (который объясняет концепции и идеи кода),
но сама техника введения макро вместо кропотливых кусков чтобы теми кусками заняться в
их очередь и избавить мозг от нагрузки по ведению учета и контроля тысячи мыслей -- то
есть для того, чтобы в конечном счете СТАТЬ УМНЕЕ за счет механизма абстрагирования --
эта техника возможна и совершенно без комментариев.
Которые почему-то все настаивают есть не заметки в помощь программисту, а некая "документация"
якобы для посторонних людей.
Нет, запись мыслей ПОМОЖЕТ и будет служить документацией идей, да. Но создается это не для
Идеального Читателя васи, а для себя в момент программирования.
Explanation-2
Date: 2009-11-22 06:48 pm (UTC)ЛП не популярно) не к месту потому что ПОХЕРУ хорошо ли программист пишет или так себе: он
пишет для себя в помощь мыслям. По-моему неверно сразу ставить психологический барьер: "вы
обязаны извлечь из себя блестящее эссе-программу".
Чтобы стало понятнее, возьмем последний литературный пример. Он был без комментариев. Если
теперь "восстановить" те реалистические комментарии, которые там могли бы появиться в процессе,
это выглядело бы примерно так:
Анекдот пойдет в эпиграф третьего раздела (? - или в основной текст?)
<<quote>>=
A HISTORICAL CURIOSITY
this is a <<story>> that was used
by Emperor Friedrich II when he replied
to <<ambassadors>> of France, famously:
"bla-bla-bla.
<<quote_continued>>"
@
Уточнить дату и обстоятельства:
<<story>>=
histoical quote that first surfaced in a lesser-known Austrian publication in 1843
@
Нужны имена; если нет, выдумать: публика дура и любит "точность"
<<ambassadors>>=
Earl Marra and Count Swiepolski
@
Кажется цитата была в моих архивах: сделать поиск на хррр? пст?
Брал её из гугла; вспомнить еще какие-то слова
<<quote_continued>>=
Hrrrrrr mbrruaghhhrch
awwrraghrtps
pst pst pst.
@
.. ну а заполненные позже куски составят уже полный чистый текст, который НЕ НАДО лазить править
руками.
То есть в момент написания мы отодвинули массу соображений, которые занимают весьма
ограниченные ресурсы мозга (всего-то до 7, говорят, элементов в краткосрочной памяти) и
необходимости решать и увязывать детали.
Мы стали "умнее" за счет того, что убрали, отодвинули куски деятельнопсти, заменив их на
время фразами-абстракциями.
Вот в чем суть.
no subject
Date: 2009-11-17 08:13 pm (UTC)Где попыриться на пример кода? Есть ли веб для SQL?
no subject
Date: 2009-11-17 08:48 pm (UTC)Можешь посмотреть на исходник TeX-а по ссылке в посте.
Вообще я хотел в следующем посте примеры показывать, но можешь глянуть вот сюда:
http://github.com/naa/Articles/raw/master/AffineLieAlgebras/MaplePrograms/ClassicalBranching.nw
Вообще noweb не различает языки, я его вообще для Maple использовал. К сожалению, я не знаю примеров именно для SQL, а на http://LiteratePrograms.org на SQL есть только Hello World! (http://en.literateprograms.org/Hello_World_%28SQL%29), который не использует возможностей средств литературного программирования по реорганизации порядка кода для удобства чтения.
no subject
Date: 2009-11-17 10:10 pm (UTC)0. Вы написали верно. Это не такое малое достижение, учитывая количество непонимания вокруг совершенно конкретной техники программирования. Её смешивают (а) с системой документации и (б) с особенной разговорчивостью в комментариях к коду.
Однако Л.П. (и "сеть" кода) может существовать вообще без комментариев, хотя это было бы субстандартным применением техники.
1. Отсылать людей к оригинальному ВЕБу (или СиВЕБу) пожалуй слишком жестоко.
Де-факто стандарт для повседневного употребления - "noweb" Нормана Рамзи, который
написал его как свой еще более упрощённый вариант упрощенного инструмента nuweb.
И nuweb, и noweb не привязаны к одному языку программирования, а noweb к тому же не провязан жестко и к ТеХу.
noweb написан на скриптовом языке (-ых -ах, есть две версии), и в очень стабильном виде существует уже больше десятка лет.
Есть еще и независимый от ТеХа написанный на Си funnelweb, монолитный самодостаточный инструмент. Его проблема - в уродском выборе разметки, который заставляет отказаться от набивки макро. То ли я разучился писать aliases для моего редактора ;))
Так что отсылайте к noweb'у для первого знакомства
2. Написано все правильно. Однако для понимания нужны примеры.
(а) я в свое время переписал статью в английской википедии и выдержал маленькую войну с идиотами, которые отказывались верить каждому из сделанных мной основополагающих утверждений. В результате я переделал ту статью ( http://en.wikipedia.org/wiki/Literate_programming ) еще раз, сделав её ПОЛНОСТЬЮ из Кнутовских цитат.
Атака и. ослабла, и они нанесли последний, вялый удар, изгнав все цитаты в "ссылки", где их никто никогда не прочитает.
В той статье есть обрывок, недостаточный, примера того, как Л.П. делается. Подробнее в ЖЖ и на русском примеры рассматриваются например здесь:
http://anonym-mouse.livejournal.com/2323.html
(кстати одно из эссе Стива Егге переведено в том же журнале:
http://anonym-mouse.livejournal.com/1294.html )
3. Я может быть все же доведу скрипт Молли до сколько-то пригодного вида. Встроил в него tangler (пока еще не подгрузил версию на github, но добавлю скоро), который вроде бы дает на тестах те же результаты, что и notangle.
Хочу сделать одно расширение: чтобы он мог tangle из НЕСКОЛЬКИХ файлов.
Т.е. вы ведете проект, в какой-то момент разрезаете механически свой Literate Source file на куски, не заботясь о том, чтобы они были самодостаточны. Потом просто дав все куски на командной строке скрипту, который вызывается в роли tangler'а, вы можете получить свой код, где бы он там по кускам не извивался.
Насколько я знаю, никто так почему-то не делал. А это в принципе элементарно.
4. Да, еще вот что. После написания статьи в Википедию я начал было делать русский вариант и сломался.
Можно добавить/заменить текст в русской википедии на ваше объяснение, оно разумно.
Туда же надо дать и кусочек конкретного примера, можно или из ссылки или из второй части вашей заметки.
no subject
Date: 2009-11-17 10:20 pm (UTC)Я русскую википедию прочитал когда текст этого поста уже был в основном написан и понял, что я фактически переписал вашу статью своими словами :)
В следующем посте на эту тему я попробую описать noweb и Molly, единственное, что я вряд ли смогу как следует разобраться в исходниках - очень давно не писал на Perl.
Кстати, какой редактор вы используете для noweb-файлов?
Мне не очень нравится noweb-mode в emacs неправильной подсветкой, а noweb2-mumamo-mode из состава nxhtml к сожалению падает.
no subject
Date: 2009-11-17 10:31 pm (UTC)Скрипт написан довольно неряшливо, и его надо чистить. Т.е. сохранить функциональность, но почистить код.
Хотя он небольшой сам по себе. Вместе с новым tangler'ом - меньше 1000 строчек кода (из которых большой кусок - вставленный html stylesheet)
Сейчас с ним трудно работать из-за излишней болтливости комментариев.
Она возникла:
(а) потому что я намеренно пробовал, как можно крутить этот формат, "складной хтмл"
(б) порезал на слишком мелкие кусочки, наверно
(в) проверяя концепцию, что Л.П. - не создание отполированного эссе (это лишь одна из целей), пользовался файлом чтобы держать заметки для памяти, обрывки тестов или кода, который я не стал применять и т.д.
Может быть еще одно расширение - добавить conditional weaving и/или conditional tangling, когда подразделы документа включаются или нет в "чистый" вариант.
Тогда разработчик может держать полную, неряшливую версию, а посторонним выдавать лишь набор "чистых" разделов из документа.
Технически это все довольно прямолинейно.
Впрочем, я посмотрел код альтернатив
Date: 2009-11-22 04:39 pm (UTC)В нем _всего_ 1000 строчек, он состоит из _одного_ маленького куска, который не надо "устанавливать на систему", и он при том делает основные операции вполне себе ОК.
Так что код почищу, но прибедняться больше не буду ;))
no subject
Date: 2009-11-18 07:08 am (UTC)no subject
Date: 2009-11-18 11:29 am (UTC)Программисты пишут много и вообще люди стали много писать. Кстати, посты про программирование часто получаются похожими на литературные программы - как раз двойной рассказ на формальном и естественном языке о том, как сделать что-то.
Другое дело, что это началось не с блогов, сначала стали писать письма по электронной почте и участвовать в usenet-обсуждениях, потом ещё всякие форумы появились и так далее.
Кнут, очевидно, сравнивает с тем временем, когда он придумывал литературное программирование (первая статья вышла в 1982 году), тогда явно средний программист писал меньше текста.
Хотя недавно я читал интереснейшее обсуждение (http://ivanov-petrov.livejournal.com/1316002.html) о том, что молодёжь разучилась писать и выражать свои мысли. Но это явно не относится к программистам, тем более в других странах.
no subject
Date: 2009-11-28 07:27 am (UTC)Article {Rnews:Leisch:2002}
Author: Leisch, Friedrich
Title: Sweave, part I: mixing R and LaTeX
Journal: R News
Date: 2002
Volume: 2
Number: 3
Pages: 28--31
month: December
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2002-3.pdf
Article {Rnews:Leisch:2003}
Author: Leisch, Friedrich
Title: Sweave, part II: package vignettes
Journal: R News
Date: 2003
Volume: 3
Number: 2
Pages: 21--24
month: October
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2003-2.pdf
Article {Rnews:Betebenner:2005}
Author: Betebenner, Damian
Title: Using control structures with Sweave
Journal: R News
Date: 2005
Volume: 5
Number: 1
Pages: 40--44
month: May
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2005-1.pdf
Article {Rnews:Kuhn:2006}
Author: Kuhn, Max
Title: Sweave and the open document format -- the odfWeave package
Journal: R News
Date: 2006
Volume: 6
Number: 4
Pages: 2--8
month: October
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2006-4.pdf
no subject
Date: 2009-11-28 12:33 pm (UTC)no subject
Date: 2009-12-19 09:32 am (UTC)no subject
Date: 2009-12-19 05:41 pm (UTC)Надеюсь, что через несколько дней.
Экономьте до 30% на заправке Вашего автомобиля!
Date: 2011-06-20 12:52 pm (UTC)Как экономить 10-30% топлива автомобиля?
Использовать кондиционер для камеры сгорания двигателя!
Вы получаете реальную ЭКОНОМИЮ ТОПЛИВА благодаря более быстрому и эффективному его сгоранию.
Экономия составляет от 7 до 14% бензина или дизельного топлива - гарантировано, а по факту, в среднем 20%. Этот уникальный продукт изготавливается в США, является 100% органическим катализатором топлива, а не обычной химической присадкой, и поэтому абсолютно безопасен для двигателя и человека. Главное что получает водитель - это защита автомобиля от плохого топлива и новое качество езды. Увеличение ресурса двигателя, срока службы катализатора, свечей, форсунок и поршневой системы. Уменьшение вредных выбросов выхлопных газов на 70-90%.
Стоимость продукта на 1 заправку обходится всего ~1-1,2 долл., но сэкономит Вам ~6,5-24 долл. топлива.
Зайдите на презентационный [url=http://economy20.prav.tv][b]сайт[/b][/url] и забронируйте билет на бесплатный Тест-Драйв, чтобы узнать об этом подробнее!
С вопросами обращайтесь сюда - support-eco20(а)ukr.net или в контактные данные на сайте.
ключевые слова
----------------------
автомобили, машины, авто, автомашины, бензин, бережливость бензина, экономия топлива, экономить бензин, экономить топливо, дизель, дизельное топливо, экономить дизель, экономить дизельное топливо, экономить на заправке, экономить быть заправке, сэкономить при заправке, уменьшить выхлоп, уменьшить вредные вещества при выхлопе, уменьшить выхлоп вредных веществ, уменьшить выхлоп CO2, выхлоп CO2, BMW, БМВ, mpg-boost, mpg-caps, ffi, сэкономить для заправке, toyota, nissan, аукционное авто, тойота, нисан ..
Компьютерный портал Беларуси
Date: 2011-10-10 05:25 pm (UTC)