пятница, 4 мая 2012 г.
Стальной оцинкованный лисп
Краткая и неполная хроника лопатных походов на 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
Кратко о себе: не женат, бородат, виндовсат, упарываю лиспы, компиляторы, компиляторы лиспов, дотнеты, кофеин, немного монад и табак.
Почему читать:
- незамутненный Идеологией™ взгляд на положение вещей -- я уже вырос из того возраста, когда убеждения важнее личного удобства;
- просто и понятно -- мне лениво выебываться, называя монады моноидами в категории эндофункторов;
- практические советы вместо теоретических размышлений -- это в теории теория не отличается от практики, на практике все не так.
- поклонения святейшим идолам здесь не будет;
-
дохуя матажесткая лексика;
- ТОЛСТО.