Во-первых, я не думаю, что согласен с вашим утверждением, что «метапрограммирование - это« будущее кодирования »». Это отличный инструмент, но не всем он нравится (например, разработчики Java намеренно исключили макросы из языка - не то чтобы мне нравилась Java, но у людей действительно есть причины возражать против метапрограммирования).
В любом случае ... Я могу думать о двух разных способах выполнения метапрограммирования: на синтаксическом уровне и во время выполнения.
Для синтаксического метапрограммирования я думаю, что Scheme - хороший вариант (если бы вы не упомянули простоту и т. Д., Я бы предложил Common Lisp). Что касается метапрограммирования во время выполнения, я полагаю, что и Prolog, и Smalltalk очень интересны. (Вы можете добавлять, изменять и удалять факты в базе данных Prolog "на лету"; и вы можете "на лету" изменять объекты Smalltalk на). Вы, вероятно, можете выполнять метапрограммирование во время выполнения и в Ruby, но я не знаю Ruby.
Итак - в Scheme есть несколько различных методов метапрограммирования (разные макросистемы). Я предлагаю вам взглянуть на какую-нибудь базовую книгу схем, а затем прочитать о двух разных макросистемах.
Некоторые хорошие книги по схемам:
Реализации схем сильно отличаются друг от друга, поэтому вы также будете использовать свое руководство по реализации схемы. тоже много.
Некоторые места, где можно узнать о макросах схемы:
Если вы решили использовать язык, который больше и сложнее Scheme, попробуйте Common Lisp. Я бы предложил три книги:
Что касается Пролога, вы можете прочитать «Программирование на Прологе» Клоксина и Меллиша (получите последнюю версию!), А затем перейти к «Глубокое программирование на Прологе» Ковингтона, Веллино и Нута. См. Главу 6.
Есть много хороших книг по Smalltalk. Мне нравится "Искусство и наука Smalltalk" Саймона Льюиса.Есть очень хорошее бесплатное руководство / учебник от Canol Gokel и по Smalltalk (но это не касается обучения метапрограммированию).
Лиспы - это в значительной степени язык выбора для широкого спектра техник метапрограммирования. Из современных лиспов я бы рекомендовал Clojure как более доступный лисп, имеющий доступ к огромной библиотеке (все, что есть в стране Java), если вам нужно что-то мощное и немедленно полезное.
Для других подходов к метапрограммированию подойдет практически любой функциональный язык. Haskell - хороший выбор для изучения методов и функционального программирования, но это не самый практичный язык для реальной работы в настоящее время. Erlang более практичен, но не так хорошо поддается метапрограммированию. OCaml - еще один возможный выбор, но он также немного страдает с точки зрения практичности. Однако во многих отношениях он более доступен, чем Haskell.
В мире скриптовых языков Ruby - это язык, в котором метапрограммирование является популярной техникой. Его подход смутно напоминает Lisp, но с гораздо более традиционным синтаксисом. Однако ему не хватает полной мощи и гибкости Лиспа, но с другой стороны, за исключением Clojure, о котором говорилось выше, он имеет гораздо больше непосредственной практической пользы.
Ruby обладает очень мощными и гибкими возможностями метапрограммирования.
Есть несколько языков, которые я бы рекомендовал для изучения мета-программирования.
Первый - это Prolog. Программа на Prolog - это база данных. Прологский "код", клаузулы, являются частью данных. Программа может читать их, включая их содержание. Она также может генерировать новый код как структуру данных и утверждать его, тем самым изменяя себя во время выполнения. И все это без использования расширения терминов, которое представляет собой интеллектуальную систему макросов Prolog. Некоторые книги по ИИ на Прологе начинают с реализации метаинтерпретатора на Прологе, а затем изменяют его по необходимости.
Вторым, как уже упоминалось, является Lisp, и особенно CLOS (Common List Object System), который включает команды для мета-ООП.
Наконец, Python поддерживает приятный и не слишком непонятный механизм для мета-программирования во время выполнения, который представляет собой мета-классы (классы, создающие классы).
Что вы имеете в виду под метапрограммированием? Метапрограммирование - это набор концепций, а не одна конкретная техника.
См. этот ответ , где я перечислил различные концепции и родственные языки. Вот резюме:
Подробнее см. Полный ответ. Вообще говоря, я считаю, что Ruby - это хороший универсальный объектно-ориентированный объект. В противном случае любой Lisp-подобный ему подойдет: это как замазка в ваших руках. Но это будет зависеть от того, что вы хотите сделать ...
Я удивлен, что никто не упомянул ML. ML расшифровывается как Meta Language. так что ... да ... CaML - это стандартная реализация. (OCaML, который ПРОСТО МОЙ правильный OPINIO упомянул, это OO-версия CaML, которая, вероятно, добавляет функции, которые делают метапрограммирование менее очевидным ...)
Помимо этого, я большой поклонник Scheme, но в значительной степени для этого годится любой функциональный язык программирования ... Всегда есть Маленький Лиспер, извините, Маленький Шеймер ...
Не знаю, есть ли у нас такое же определение «метапрограммирования», но определенно не существует ОДНОГО лучшего языка для изучения. Я предлагаю вам глубже взглянуть на функциональное программирование. Какой язык выбрать для этого, зависит от вашего опыта и условий работы. Я бы сейчас выбрал F #, но Haskel тоже должен быть хорошим выбором.
ура, Ахим