пятница, 4 мая 2012 г.

Стальной оцинкованный лисп

В жизни каждого "языкового" сообщества рано или поздно наступает один интересный период: когда самые вопиющие проблемы языка уже решены и аксакалы с нетерпением ожидают бурлящего потока неофитов, но сам этот поток еще до сообщества не добрался, наиболее преданные идеалам иерархи обращают свой взор в неизведанные (ими) дали. И незамедлительно их зрительные органы оскорбляются видом хтоничного чудовища, не проявляющего никакого уважения к их заветам и заповедям. Оскорбление, нанесенное нашим апостолам настолько велико, что они, не раздумывая ни минуты, немедленно собирают могучую дружину из лучших людей сообщества, вооружают ее освященными лопатами и благословляют его на исполнение священной миссии: Lisp должен быть закопан.

Краткая и неполная хроника лопатных походов на Lisp:


Время: 70-е - 80-е года прошлого века
Закапывающие: C
Итог: C: с боями выбил себе нишу низкоуровневого программирования и тяжелого байтоебства и окуклился.
Lisp: проебаны Lisp-машины, сообщество объединилось под знаменем Common Lisp.

Время: конец 80-х - 90-е года прошлого века
Закапывающие: C++
Итог: C++: превратился в мумифицированный труп, изредка гальванизируемый для выжимания чуть большей производительности.
Lisp: ничего не заметил.

Время: начало 90-х
Закапывающие: Dylan
Итог: Dylan: породил несколько личинок, забыт.
Lisp: счел Dylan отличной шуткой.

Время: конец 90-х - начало 00-х
Закапывающие: Java
Итог: Java: до сих пор стучится лбом в хитиновый панцирь.
Lisp: урча и помжвякивая вобрал в себя виртуальные машины.

Время: начало-середина 2000-х
Закапывающие: личинки Dylan (Python, Ruby) и примкнувший к ним PERL
Итог: PERL выкинут на свалку истории, Python и Ruby выгнаны ссаными тряпками в веб.
Lisp: показательно проигнорировал недоязычки.

Время: 2000-е - 2010-е
Закапывающие: Caml, Haskell
Итог: Закапывающие: держатся впереди за счет бурной активности не испорченных адекватностью прозелитов.
Lisp: гонится за незадачливыми закопщиками, с громоподобным "ОМ НОМ НОМ НОМ" вбирая в себя их идеи.

вторник, 13 марта 2012 г.

with-sanity

Как часто вам, посоны, приходилось писать что-то вроде
SomeBoilerplate(1);
MoreBoilerplate("Some parameter");
TheCodeThatYouActuallyNeed();
YetAnotherPieceOfBoilerplate(Foo.Bar);
а чуть более в другом месте
SomeBoilerplate(0);
MoreBoilerplate("Other parameter");
YouNeedThatCodeToo();
YetAnotherPieceOfBoilerplate(Foo.Baz);
?
Сразу видно, что можно бы завернуть все это дело в функцию, принимающую параметры для бойлерплейтного кода... вот только действительно нужный код везде разный и в лучшем случае нам удастся свести три строки бойлерплейта к двум. Это, конечно кажется выходом, когда лишних строк больше десяти, но все равно, надо о них помнить и надо их писать (или копипастить).
Так вот, пока овцеебы из Вильяриба наворачивают на это слои говна абстракций из классов, интерфейсов и генериков, щедро сдабривая все это паттернами, веселые ребята из Вильябахо не страдают хуйней и пишут макрос вроде этого:
(defmacro with-boilerplate (number string enum &rest body)
  `(progn
     (some-boilerplate ,number)
     (more-boilerplate ,string)
     ,@body
     (yet-another-piece-of-boilerplate ,enum)))
Применяется он так:
(with-boilerplate 1 "Some parameter" 'foo-bar
                  (the-code-you-actually-need))
(with-boilerplate 0 "Other parameter" 'foo-baz
                  (you-need-that-code-too))
Правда, охуенно?
В F# это делается примерно так же:
let WithBoilerplate aNumber aString aEnum aBody =
    SomeBoilerplate aNumber
    MoreBoilerplate aString
    aBody ()
    YetAnotherPieceOfBoilerplate aEnum

WithBoilerplate 1 "Some parameter" Foo.Bar (fun () -> TheCodeThatYouActuallyNeed())
WithBolierplate 0 "Other parameter" Foo.Baz (fun () -> YouNeedThatCodeToo())
Правда, это уже не будет раскрываться во время компиляции и мы понесем все тяготы и лишения -- пролог и эпилог на байтоебском спике -- которые связаны с вызовом функции. Впрочем, это уже проблема компилятора и байтоебов.
К сожалению, в C# мы похожие макросы получим разве что через пару лет (а в Java -- сразу после никогда) когда то, что сейчас стыдливо прозывается Roslyn будет более-менее широко применяться, но и сейчас в нем можно сделать кое-что похожее:
using System;

public class WithBoilerplate
{
    public static void Do(int Number, string Str, Foo BarOrBaz, Action UsefulCode)
    {
        SomeBoilerplate(Number);
        MoreBoilerplate(Str);
        UsefulCode();
        YetAnotherPieceOfBoilerplate(BarOrBaz);
    }
}
WithBoilerplate.Do(1,"Some parameter",Foo.Bar,() => TheCodeThatYouActuallyNeed());
WithBoilerplate.Do(1,"Other parameter,Foo.Baz,() => YouNeedThatCodeToo());

пятница, 24 февраля 2012 г.

Пишите лиспы только на свежую голову

Сейчас видел такой глюк, который ни под каким хитрым составом не увидеть.

Вот представьте, стоит себе человек в футболке с надписью LOOP. Вокруг него движется карусель, которую тянет человек в тельнике с надписью READ и толкает человек в майке с надписью PRINT. На самой карусели с дебильно-восторженными лицами крутятся еще два человека: у первого на футболке написано EVAL, у второго -- APPLY.

По ходу карусели вырастают деревья, которые READ между делом срывает и втыкает куда-то в карусель. EVAL и APPLY эти деревья раздирают на щепки руками и складывают из этих щепок новые деревья, которые PRINT у них отнимает и сажает обратно в землю.

Но не все деревья сразу попадают в карусель. Иногда прибегает человек в майке с надписью MACROEXPAND, отнимает дерево у READ, обламывает у него все ветви и втыкает их в ствол в другом порядке, после чего отдает его обратно.

Больше не буду писать лиспы в полусонном состоянии.

воскресенье, 19 февраля 2012 г.

It starts

Ой-вей, ребятушки. Сегодя я в очередной раз ощутил вселенских размеров БАРБЕТ от того, что место, где я ранее изливал свой праведный гнев решительно щелкнуло ластами. В этот раз БАРКАС был настолько силен, что я преодолел свою лень и решил таки обустроить себе новое местечко для статей, текстов и постов, не подходящих под анальные ограничения формат микроблога Juick, где я известен под ником @hagane.

Кратко о себе: не женат, бородат, виндовсат, упарываю лиспы, компиляторы, компиляторы лиспов, дотнеты, кофеин, немного монад и табак.

Почему читать:
  • незамутненный Идеологией™ взгляд на положение вещей -- я уже вырос из того возраста, когда убеждения важнее личного удобства;
  • просто и понятно -- мне лениво выебываться, называя монады моноидами в категории эндофункторов;
  • практические советы вместо теоретических размышлений -- это в теории теория не отличается от практики, на практике все не так.
Почему не читать:
  • поклонения святейшим идолам здесь не будет;
  • дохуя мата жесткая лексика;
  • ТОЛСТО.