love5an: (R)
2014-05-02 10:37 pm

Почему нормальное метапрограммирование только в лиспах?

Вынесу свой коммент с ЛОРа.

Есть три базовых вида абстракции:


  • На потоках(функциональная)

  • На состоянии(процедурная/оо)

  • Синтаксическая.



Синтаксическая абстракция - важная и, даже наверное, главнейшая часть метапрограммирования. Суть синтаксической абстракции - упрощение нотации в угоду предметной области. Во вменяемом виде она доступна только в диалектах лиспа, т.к:


  • Практически все другие языки программирования ради синтаксической абстракции заставляют нас переизобретать интерпретаторы и компиляторы(а это - невероятно сложное и нуднейшее занятие, потому кстати и малораспространенное - максимум, разве что, время от времени всплывают выродки на XML(maven'ы всякие, XAML и т.д.), плюс встраиваемый JS и всякое Lua - кривые и неудобные языки, отвратительнейше интегрирующиеся с нижележащей платформой).

  • В лиспе синтаксическая абстракция, кроме прочего, не лишает нас ни встроенных средств языка, ни возможностей комбинировать разные API построенные c использованием оной абстракции(чего не скажешь о интерпретаторах, см. выше).



Во-вторых, в том же CL кроме синтаксической абстракции доступны как модификация кода в рантайме, так и метаобъектный протокол. Эти два вида метапрограммирования, на самом деле, относятся ко второму вида а.(на объектах), и оба - гораздо менее мощны, чем синтаксическая абстракция(хотя и реализованы в CL на порядок приятнее и удобнее, чем во множестве других языков).