Monday, December 6, 2010

В продолжение обзора ЯП

К чему приходит тот, кого во всех языках достаёт ограниченность синтаксиса? Правильно, к Common Lisp-у =) Единственное, чего я опасаюсь, так это того, что буду строчить на нём всякую невменяемую хрень, потому что то, что язык позволяет выразить на нём всё что вздумается, не всегда полезно. Потому что вздуматься может всякое. Вот сегодняшний пример: надо было цепную дробь вычислить (на projecteuler.net зарегистрировался ради того, чтобы было на чём новый язык поизучать). Взбрела в голову шальная мысль: а что, если не сразу вычислять, а сперва выражение составить? Ну и набыдлокодил в итоге:

(defun generate-continued-fraction (lst)
  (loop with sexp = (list '+ (first lst) (list '/ 1 (second lst)))
        for num in (rest (rest lst)) do
        (loop for to-change = sexp then (third to-change)
              until (atom (third to-change))
              finally (setf (third to-change)
                            (list '+ (third to-change) (list '/ 1 num))))
        finally (return sexp)))

Ну а чё, работает же даже:

(generate-continued-fraction '(2 1 2 1 1 4 1))
(+ 2 (/ 1 (+ 1 (/ 1 (+ 2 (/ 1 (+ 1 (/ 1 (+ 1 (/ 1 (+ 4 (/ 1 1))))))))))))

Но вот о производительности такой функции лучше не думать, особенно с учётом того, что потом ещё и eval вызывается. На любом обычном языке мне б и в голову, наверное, не взбрело подобный бред писать, написал бы что-нибудь навроде
(defun continued-fraction (lst)
  (loop with rlst = (reverse lst)
        with frac = (pop rlst)
        for num in rlst do
          (setf frac (+ num (/ 1 frac)))
        finally (return frac)))

Так что надо порядок в голове наводить... %-)

Saturday, November 27, 2010

Почему не следует изучать OCaml.

Ответ простой: потому что этот язык — полное дерьмо! Подробно о том, почему это так, можете почитать в статье "OCaml Language Sucks". Я же отмечу здесь лишь то, что внушает особое отвращение лично мне:

1) отсутствие ad-hoc полиморфизма. Если вы (вдруг) не понимаете сути этого словосочетания, поясняю: представьте себе, что vkontakte.ru писался бы изначально на OCaml-е. И был бы там какой-нибудь счётчик типа int — а хер ли, любительский же проект, каким фигом он там зашкалит за два миллиарда? А вот когда он приблизится к своему пределу, окажется, что просто int на int64 не поменяешь: надо рефакторить всё к чёртовой матери, потому что конструкция a := !a + 1 уже не будет работать, надо писать a := Int64.add !a 1L — потому что функция (+) определена только для int.

2) примерно такие же пироги с массивами и строками: обращение к элементу массива — a.(i), к элементу строки — s.[i] — то бишь по гибкости OCaml даже C++ уступает, в котором хоть шаблоны есть. Для моей функции может быть неважно, массив ей дают или строку: один хер последовательность ведь! Мне что, два варианта писать, что ли?

3) из отсутствия нормального полиморфизма напрямую следует убогость всей стандартной библиотеки: скажем, String.concat для List-ов существует, а для Array-ев — чёрта с два, либо свой велосипед пиши, либо перегоняй Array в List (за O(длина_массива), разумеется). П***ец, одним словом.

Tuesday, November 23, 2010

Нумерология

Недавно заметил одну забавную штуку.

(Пояснение для нематмеховцев)
Единственный некоммерческий автобус, на котором можно доехать от студгородка до метро без пересадок — 210-й. Ходит он, между прочим, от Кировского завода (тут ещё такое совпадение, что я родом из Кирова, но это не особо удивляет, ибо от коммуняг чёртова уйма одинаковых названий осталась).

Так вот, типичный путь от зданий универа на Ваське до этого самого Кировского завода таков: 1 станция по 3-й линии, потом 2 станции по 2-й линии и 3 станции по 1-й линии. Адовая симметрия. А потом в идеале оттуда на 210-м до общаги (тоже: 2-1-0), но это редко получается, чаще приходится на 200-м и 359-м ездить =(

Sunday, November 21, 2010

Theorems graph.

Now that almost everybody's heard about the mind map concept, it seems a little weird to me that I wasn't able to find via Google anything like that:
In my opinion, it's really fucking convenient to be able to answer the question "for what the hell do I need this theorem?!" at a glance (In fact, this question is just a rephrasing of "why the hell should I know its proof?!": you know about the lazy evaluation concept, don't you?). It's especially helpful right before exams (and especially for me 'cause I've got the damn habit to devote no more than three days to an exam preparation ^____^).

By the way, GraphViz tools were used to plot this graph. If you wanna look at the source or modify it, you can download it from here.

And yeah, for the sake of showing you how devilishly horrible automatically generated graphs might be: http://llvm.org/docs/UsingLibraries.html

Saturday, November 13, 2010

GPS & Ruby: Introduction

This is the beginning of post series devoted to playing with data obtained by a GPS receiver. Here I assume that you are familiar with basic concepts of object-oriented programming and also assume that you don't know Ruby (honestly, neither do I, but that's gonna change eventually). So don't you worry, there will be a few comments about the code ;-)

In this post I'm gonna acquaint you with the NMEA format used in GPS receivers. Actually, you can read about that in details here, for example. In fact, it's a proprietary one but it's too old to not to be reverse-engineered :-)

We're gonna use just one type of NMEA sentence, namely GPRMC.

Friday, November 12, 2010

just to clarify

From now on I'm gonna write posts, which might be in interest not only for Russians, in English.

There're several (and at least three worth to mention) reasons to proceed in that way. Firstly, because such posts are gonna appear soon (frankly speaking, I don't think anything I've written until now could be ascribed to this category). Next, it seems to me like a chance to improve my English and at the same time to reach a wider audience (yep, I'm damn selfish). And last but not least — who knows, maybe my posts will be really helpful/interesting for some people? :-)

Thursday, November 11, 2010

Digma M1

Прикупил вот себе недавно GPS-приёмник Digma M1 - дёшево и сердито (за 1260р.).

Из минусов можно отметить разве что то, что нет работы по Bluetooth, присоединяется только по USB (ну а хрен ли вы хотели от столь дешёвой шняги? :-) )
Из плюсов — внутри всобачен нехилый магнит, так что шнягу можно прикрепить к любому железному элементу одежды/сумки/whatever.

Немного о настройке: чтобы устройство работало под Linux, надо лишь настроить создаваемый системой последовательный порт (у меня это /dev/ttyUSB0). Если ничего подобного при подключении не появляется — google pl2303. Так вот, надо поставить minicom и там, поковырявшись в настройках, выставить скорость 4800 бод и сохранить настройки (уж в псевдографическом интерфейсе разобраться можно даже без мануала, я гарантирую это). В общем-то всё, должно работать. (При успешной настройке команда "sudo cat /dev/ttyUSB0" должна выводить нечто читабельное. Чтобы читабельное стало ещё и осмысленным, нужно вытащить девайс на открытое пространство и подождать несколько минут, пока ищутся спутники.)