Home
кто здесь? [entries|archive|friends|userinfo]
Vladimir Grechka

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Дональд Кнут реальный пацан беспесты :-) [Sep. 8th, 2006|10:16 am]
[mood | excited]
[music |Jamiroquai - 04 Soul Education]

Решил вот на досуге более продвинуто разобрацца с TeX (кто не знает че это -- см. http://en.wikipedia.org/wiki/TeX). Я эту шнягу и раньше юзал для ваяния некоторых спек по работе, но щас взялся по взрослому. Ниже приведен кусок кода с написанными мною макросами для "реализации" работы с массивами. Согласитесь, язык для реальных хацкеров :-))... один синтаксис чего только стоит (там даже пробелы и символы комментариев "%" в конце строк имеют значение), но синтаксис -- это только начало. С точки зрения программинга TeX сильно отличается по парадигме от всего с чем мне приходилось работать: и от императивных C-подобных языков, и от функциональных (SML, Haskell), и от смешанных императивно-финкционально-объектно-скриптово-синтакс-шугарных по типу Ruby и Python, и от логических, и от всевозможных демен-специфик и разметочных языков... Очень рекомендую всем программерам для расширения кругозора! Не даром умные люди говорят, что чем больше языков знаешь, тем более толковый ты программер. А еще говорят, что если новый язык не привносит ничего нового в твой способ восприятия программирования, то такой язык не достоен изучения. Так я вам скажу: TeX достоен изучения :-). Рекомендую литературу (доступную в инете): "The Not So Short Introduction to LaTeX" (for novices), "A Gentle Introduction to TeX" (for novices)... и самая весч для программинга на TeX: "TeX by Topic, a TeXnician's Reference" (advanced hacking).

Когда я написал этот код, и он заработал как надо (было потрачено около 8-и часов), то был в экстазе :-))):

..............

%------------------- \tokenize --------------------

\def\term{\relax}

\def\tokenize#1\by#2\doing#3{%
    \def\tok##1#2##2{%
        #3{##1}%
        \ifx\term##2{}\else\tok##2\fi%
    }%
    %
    \tok#1#2\term%
}

%------------------------- arrays -----------------------------------

\def\newarray#1{%
    \expandafter\newcount\csname ___array(#1).size\endcsname%
}

\def\arrayadd#1#2{%
    \expandafter\def\csname ___array(#1).item(\arraysize{#1})\endcsname{#2}%
    \advance\expandafter\csname ___array(#1).size\endcsname by 1 %
}

\def\arraysizec#1{%
    \csname ___array(#1).size\endcsname%
}

\def\arraysize#1{%
    \expandafter\the\arraysizec{#1}%
}

\def\arrayitemc#1#2{%
    \csname ___array(#1).item(\the#2)\endcsname%
}

\def\arrayitem#1#2{%
    \csname ___array(#1).item(#2)\endcsname%
}

\def\arrayset#1#2#3{%
    \expandafter\def\csname ___array(#1).item(#2)\endcsname{#3}%
}

\def\earrayset#1#2#3{%
    \edef\earraysetXvalue{#3}%
    \arrayset{#1}{#2}{\earraysetXvalue}%
}

\def\arraysetc#1#2#3{%
    \edef\arraysetcXtmp{\the#2}%
    \arrayset{#1}{\arraysetcXtmp}{#3}%
}

\def\earraysetc#1#2#3{%
    \edef\earraysetcXidx{\the#2}%
    \edef\earraysetcXvalue{#3}%
    \arrayset{#1}{\earraysetcXidx}{\earraysetcXvalue}%
}

\def\split#1\by#2\toarray#3{%
    \newarray{#3}%
    \def\tok##1#2##2\endtok{%
        \arrayadd{#3}{##1}%
        \ifx\term##2\relax\else\tok##2\endtok\fi%
    }%
    %
    \tok#1#2\term\endtok%
}

\long\def\forrange#1\from#2\to#3\do#4{%
    \newcount#1#1=#2%
    \def\iterate{\ifnum#1<#3#4\advance#1 by 1 \iterate\fi}%
    \iterate%
}

%-------------------------- tables ------------------------------

\newdimen\textwidth \textwidth=12cm

\def\cell\width#1\margin#2\border#3#4#5#6#7{\bgroup%
    \newdimen\w\w=#1%
    \advance\w by -#2\advance\w by -#2%
    %
    \vtop{\hsize=\w\if#41\hrule\fi%
        \hbox{\if#31\vrule\fi\hskip#2%
            \vbox{\vskip#2{#7}\vskip#2}%
            \hskip#2\if#51\vrule\fi%
        }\if#61\hrule\fi%
    }%
\egroup}

\def\table\padding#1\colwidths#2#3{\bgroup%
    \edef\padding{#1}%
    %
    \split{#2}\by{ }\toarray{colwidths}%
    \forrange\i\from0 \to\arraysize{colwidths}\do{---\arrayitemc{colwidths}\i}%
    \newarray{coldims}%
    \forrange\i\from0 \to\arraysize{colwidths}\do{%
        \newdimen\tableXd\tableXd=\textwidth%
        \edef\tableXn{\expandafter\number\arrayitemc{colwidths}\i}%
        \multiply\tableXd by \tableXn%
        \arrayadd{coldims}{\tableXd}%
    }%
    \forrange\i\from0 \to\arraysize{coldims}\do{(\expandafter\the\arrayitemc{coldims}\i)}%

................

Жесть, кароче :-)
link9 comments|post comment

(no subject) [Jul. 14th, 2006|07:20 pm]
кря-кря
link2 comments|post comment

тулзы [Jul. 14th, 2006|06:11 pm]
Навеяно этим http://community.livejournal.com/programmers_fun/8448.html

* Defucktoring Browser. Cм. Refactoring Browsers. позволяет искать и исправлять матюкливые идентификаторы и комменты в коде без изменения функциональности. Варианты: стендэлон тулзовина, плагин к айдеешке.

* FuckingCoverage (вариант: Fuckertura). См. Cobertura. Определяет процент покрытия кода матюками (на уровнях сорс файлов, пакетов и всего проекта). Также показывает процентное соотношение матюкливого кода к полит корректному. Тулза обычно интегрируецца в билд системы типа Maven + CruiseControl, репорты посылаюцца девелоперам при каждом билде.

* FindFucks. См. FindBugs, PMD. Анализирует исходный код на предмет наличия матюкливостей. Каждая матюкливость оцениваецца по шкале minor --> warning --> error --> severe --> customer-killer, в зависимости от степени грубости. Также интегрируецца в билд системы и шлет отчеты при билдах. Есть вариант настройки с заданием кастомных brutal code patterns.

* FuckZilla. См. Bugzilla. Тулза интегрируецца с FindFucks и на каждый случай брутального кода заводит соответствующий тикет в багзиле. На кого ассайнить тикет определяецца с помощью CVS Show Annotation. Возможен вариант настройки для параллельной отсылки жалобных писем на провинившегося девелопера начальству.

* FuckUnit. См. xUnit. Тестирует работоспособность кода используя в качестве входных параметров рендомно генерируемые брутальные слова и их комбинации вместо привычных "foo", "bar" и т.д. Обеспечивает требование  к коду специальным образом обрабатывать матюки, которые вводят юзеры (к примеру не пускать такие посты, заменять матюки звездочками в постах и т.д.) Вариант: расширение xUnit-овского фреймворка.

* FuckRCS. См. CVS, Subversion. Не принимает коммиты, содержащие матюки в комментах к комиту и/или в комитящемся коде. Вариант: надстройка над CVS.
link4 comments|post comment

navigation
[ viewing | most recent entries ]

Advertisement