Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Возможность Lisp, которые позволяют бороться со сложностью крупных систем (против которых, как уже показала практика, ООП-подход бессилен) — это возможность создания многослойных слабосвязанных систем за счет проблемно-ориентированного программирования (прежде всего на основе макросов)
Mixin
QString sText = ""; MyMixin( sText ).MyMethodAddedToQString();
диспатчеризация по нескольким параметрам
диспатчеризация по значению
возможность добавить какой-то код, к методу, специализированному для конкретного класса — например, для проверки значений, или конвертации значений
насчет метапрограммирования — в C/C++ макросы — это простые подстановки текста
Я не знаток Qt, но он выше головы С++ не прыгнет
но это уже получается отдельный язык
Шаблоны и метапрограммирование в C++ могут решить часть задач, но это не прямая замена лисповым макросам — они не генерят исходный текст на С++, как генерят макросы лиспа
время компиляции увеличивается очень сильно
и оно дурит на достаточно сложных грамматиках
К тому же стоит не забывать, что в промышленной разработке часто используются старые компиляторы, которым становится плохо от шаблонов — у меня сейчас в поддерживаемых платформах VC6, gcc 3.3, старый сановский компилятор и т.д.
насчет добавления кода — CLOS дает возможность выполнения некоторого кода до или после (в стандартных комбинаторах) вызова основной функции, специализированной для определенного класса. Например, с его помощью можно добавить pre и post проверки к уже написанному коду (к которому даже может не быть доступа). Или, как в примере из PCL, разрешить операцию снятия денег для банковского счета с разрешенным овердрафтом, если там не хватает денег.
Возможность Lisp, которые позволяют бороться со сложностью крупных систем (против которых, как уже показала практика, ООП-подход бессилен) — это возможность создания многослойных слабосвязанных систем за счет проблемно-ориентированного программирования (прежде всего на основе макросов)? :)
в последние годы появились средства (в первую очередь в C#/.Net) которые позволяют упростить процесс создания ПО. Но такой гибкости языка пока ни у кого нет :-)
(defun ido-file-extension-lessp (a b)
(let ((n (compare-strings a 0 nil b 0 nil nil))
lessp p)
(if (eq n t)
nil
(if (< n 0)
(setq n (1- (- n))
p a a b b p
lessp t)
(setq n (1- n)))
(cond
((= n 0)
lessp)
((= (aref a n) ?.)
(ido-file-extension-aux a b n lessp))
(t
(while (and (> n 2) (/= (aref a n) ?.))
(setq n (1- n)))
(if (> n 1)
(ido-file-extension-aux a b n lessp)
lessp))))))
Lisp — экзотика рулит