Category: армия

Category was added automatically. Read all entries about "армия".

satyr

CL -- это конструктор!

Продублирую мой коммент из этой ветки, может, кому еще пригодится.

> С++ на лиспе. местные элитные лисперы выпендриваются, а пишут такую же хуету.
> у него классный код, но очень в духе C: запустил, посчитал, вышел.


Вот ты делаешь громкие заявления, а идеологии лиспа так и не понял :) Вот две основные ошибки, которые делают большинство лисперов:

- CL функциональный язык. Но это даже близко не так! Коммон лисп (не схема), за счет активного использования т.н. "duality of syntax" еще менее функционален, чем даже c++.
- Главная сила CL -- в iterative development (REPL, slime, hot code swapping). Это все есть, но это лишь весьма приятные бонусы платформы (но не языка как такового).

CL -- это вообще не язык сам по себе. Это конструктор языков. Основная мощь CL в той простоте, с которой создаются DSL под каждую (даже самую мелкую) конкретную задачу. Это позволяет писать программу на самом высоком уровне, используя мощные абстракции, но при этом генерируя очень эффективный код!

Рассмотрим на нашем примере с годзиллами. Задача, например, исключительно итеративная. Если переписать ее буквально слово в слово из постановки на CL, то получится следующее:

  (iter (with n-tests = (read))
        (repeat n-tests)
        (for n-g = (read))
        (for n-m = (read))
        (max-power g-max by n-g)
        (max-power m-max by n-m)
        (format t "~:[MechaGodzilla~;Godzilla~]~%" (>= g-max m-max)))

Очень тупо: прочитать, повторить, найти силу, сравнить, напечатать победителя. Это DSL, синтаксис ровно ложится на задачу.

Теперь точно так же определим в рамках нашего DSL силу армии:

(defmacro-clause (MAX-POWER result BY count)
  `(progn (for ,result = (iter (repeat ,count) (for v = (read)) (maximizing v)))))

Вот и все, программа готова! Здесь мы использовали следующие DSL:
- iterate, как язык программирования для итеративных процессов
- format, как язык программирования для печати данных
И написали один свой DSL: язык для определения силы армии :)

Теперь еще раз: мы решили задачу в 9 (!) коротких строчек кода, используя в качестве абстракций ЯЗЫКИ (а не контейнеры, функции, классы и пр.). Никаких лишних движений, ровно запись алгоритма.

А теперь фокус: натрави на программу macroexpand-all, и посмотри на ту простыню низкоуровнего кода, что именно будет компилироваться в бинарь :) Вот в этом и есть сила CL.