Программируем по-литературному

предыдущая серия

В качестве простейшего, но очень наглядного примера применения литературного программирования (ЛП) возьмём скрипт noweb.py автора Jon Aquino (на гитхабе). Этот скрипт берёт исходный текстовый файл, размеченный в формате markdown, который содержит код программы, сформированный в соответствии с принципами литературного программирования, и генерирует на выходе исполняемый питоновский код. В поставку входит файл noweb.py.txt, который, собственно, представляет собой сам этот скрипт noweb.py, выполненный в «литературном» стиле.

Этот файл больше похож на readme (что естественно), и так же естественно читается сверху вниз. Кусочки (чанки) кода выделяются по правилам ЛП так: сперва в << >> = берётся произвольный текст — по сути псевдокод, далее следует сам код, и завершается чанк символом @.

Как может работать такой скрипт? Сперва естественно считать сам файл, и составить массив чанков, где ключом будет псевдокод из << >> , а значением — сам код. Этот чанк называется

<<Reading in the file>>=
...
@

Далее автор придумал небольшую рекурсивную функцию, которая извлекает чанк по его имени (при этом мы программируем чанки в удобном нам порядке, но этот порядок может совершенно не соответствовать последовательности выполнения чанков):

<<Recursively expanding the output chunk>>=
...
@

Теперь для этого нужен код, который выдаёт результирующий код в том порядке, в каком указаны чанки в «главном» чанке:

<<Outputting the chunks>>=
...
@

Логично распарсить аргументы командной строки:

<<Parsing the command-line arguments>>=
...
@

«Главный» чанк определяется произвольно. Скрипт подразумевает, что это будет имя файла, соответствующее параметру вызова. Вот код самой программы:

<<noweb.py>>=
#! /usr/local/bin/python
# By Jonathan Aquino (jonathan.aquino@gmail.com)

import sys, re
<<Parsing the command-line arguments>>
<<Reading in the file>>
<<Recursively expanding the output chunk>>
<<Outputting the chunks>>
@

Писать наш код и формировать чанки мы можем совершенно произвольно! При этом у нас уже фактически имеется готовая документация.

Данный скрипт предназначен для разработки небольших программ, а при создании крупных проектов в духе ЛП существует множество инструментов. Например, это pyWeb, который, конечно, не привязан к конкретному языку программирования, на котором ведётся разработка, и поддерживает сложную структуру проекта.

Поделиться статьей ...Share on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0Share on VKPrint this page

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *