| Дональд Кнут реальный пацан беспесты :-) |
[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)}%
................
Жесть, кароче :-) |
|
|
| тулзы |
[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. |
|
|