LINUX.ORG.RU

Метапрограммирование в D и Clojure, в чем разница?

 , , ,


1

3

Подскажите, пожалуйста, где мощнее метапрограммирование в Clojure или D? Есть ли в D макросы? я так не понял миксины это макросы или нет, чем они отличаются от макросов Clojure?

Можно ли расширять компилятор и насколько легко?

я так не понял миксины это макросы или нет

Миксины к макросам никакого отношения не имеют.

где мощнее метапрограммирование

Если ты ищешь мощную модель, забудь вообще про макросы, это жалкий суррогат. Смотри на языки с полной поддержкой рефлексии.

newjsser
()
Ответ на: комментарий от newjsser

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

рефлексия работает с объектами языка (в рамках модели языка), а препроцессор/макросы могут оперировать на другом уровне (как минимум на уровне сырого текста программы), такшта непонятно зачем ты всё понамешал

stevejobs ★★★★☆
()
Ответ на: комментарий от Kuzy

кто тебе мешает работать со строками как со структурой? Если есть гомоиконность, у тебя в любой строке есть структура, с которой ты можешь работать.

newjsser
()
Ответ на: комментарий от Kuzy

Чувак, рефлексия, это когда программа во время исполнения может модифицировать свой исходник. В компил-тайме нет никакого исполнения, то есть, там даже программы нет, а есть только исходник. Поэтому, компилтайм-рефлексия — это оксюморон. Не фантазируй.

newjsser
()
Ответ на: комментарий от newjsser

от фейспальма сломал пальцы на правой руке, поэтому ответить на этот и предыдущий вопрос физически не могу, прости

stevejobs ★★★★☆
()
Ответ на: комментарий от Kuzy

Лол

С каждым твоим сообщением я все больше убеждаюсь в твоей неграмотности.

In computer science, reflection is the ability of a computer program to examine (see type introspection) and modify the structure and behavior (specifically the values, meta-data, properties and functions) of the program at runtime.

http://en.wikipedia.org/wiki/Reflection_(computer_programming)

newjsser
()
Ответ на: комментарий от newjsser

хз, у меня в языке макросы пишутеся на таком же языке.

x4DA ★★★★★
()
Ответ на: комментарий от newjsser

тупорылый, в компайлтайме есть куча синтаксических объектов (source file location, lexical context, ...), которыми можно манипулировать

x4DA ★★★★★
()
Ответ на: комментарий от newjsser

Если ты ищешь мощную модель, забудь вообще про макросы, это жалкий суррогат. Смотри на языки с полной поддержкой рефлексии.

Знаем, вместо макросов будем писать конфигурашки на xml. Проходили.

turtle_bazon ★★★★★
()
Ответ на: комментарий от newjsser

изменения raw сode в рантайме мгновенно приводят к неопределенному состоянию. Например, в C++-like языках можно поменять код метода, но нельзя поменять иерархию наследования. Твоя идея сработает только для какого-нибудь убого лоулевельного императивного говна. Поэтому для изменения исходника везде используется compile-time препроцессор (возможно с compile-time рефлексией).

stevejobs ★★★★☆
()
Ответ на: комментарий от Kuzy

Читай уже что-нибудь написанное для обучения, а не википедию.

Ну ладно, давай пруф. Интересно стало, хоть один Вася Пупкин от науки несет такую ахинею, или это чисто фантазии лисп-фанбоев. Только не на жежешечки, пожалуйста.

newjsser
()
Ответ на: комментарий от newjsser

Да, парочка дурачков нашлось, ты победил.
anonimous

лядь, што?

Stil ★★★★★
()
Ответ на: комментарий от Kuzy

А ты хоть сам то читал эту ахинею? Прочитай 2-й пункт «why reflection?». Эти идиоты понимают под «рефлексией» обычные макросы. Это реально фееричные д*бы. Так держать.

newjsser
()
Ответ на: комментарий от newjsser

Мне лениво тебе что-то разжевывать, сорь. Алсо, я не понял как ты это так быстро прочел, ты же не умеешь в типы и проблему понять не мог. Видимо быстро учишься.

Kuzy ★★★
()
Ответ на: комментарий от Kuzy

Он там нанглядный пример приводит с маппингом ф-ций разной арности аргументов. Там про типы не надо знать, суть в том, что тиипизация не даст сделать такого, вот он в качестве решения предлагает в комплтайме тупо передрачить это выражение, чтобы подогнать арность. То есть, то что делают обычные макросы — тупая модификация кода в компилтайме, они это называют «рефлексией»

newjsser
()
Ответ на: комментарий от turtle_bazon

2 stevejobs, turtle_bazon. Тут, по-крайней мере, два клона anonimousa :) Перестаем кормить уже.

anonymous
()
Ответ на: комментарий от anonymous

в данном случае, может и незачем, но это не рефлексия.

anonymous
()
Ответ на: комментарий от turtle_bazon

Знаем, вместо макросов будем писать конфигурашки на xml. Проходили.

Это, как раз, и есть макросы. В рефлексивных языках ты просто берешь любой кусок кода, и делаешь с ним все что хочешь. Даже не ты, а программный объект, например ф-ция. Кусок кода даже может во время своего исполнения перезаписать сам себя.

anonymous
()
Ответ на: комментарий от anonymous

Это, как раз, и есть макросы. В рефлексивных языках ты просто берешь любой кусок кода, и делаешь с ним все что хочешь. Даже не ты, а программный объект, например ф-ция. Кусок кода даже может во время своего исполнения перезаписать сам себя.

Нисколечки не макросы. Это раз. Во-вторых, в языках с рефлексией ты как раз таки не делаешь что хочешь, а именно только то, что предоставляет тебе рефлексия. Пример в яве нельзя в теле метода вычленить конструкцию и подменить её на какую хочется.

turtle_bazon ★★★★★
()
Ответ на: комментарий от newjsser

Прими уже цианид, шизофреник.

anonymous
()
Ответ на: комментарий от turtle_bazon

Пример в яве

В яве нет настоящей рефлексии. Там вместо нее говно, которое увеличивает ЧСВ лисп-фанбоев over10000, капает им на мозги как волшебный бальзам. Макросы можно считать частным случаем рефлексии. Это рефлексия, которая возможа только в начале выполнения, либо костылями eval/quote (хотя последнее рефлексией, таки, трудно назвать, скорей имитация ее)

anonymous
()
Ответ на: комментарий от anonymous

Макросы - частный случай рефлексии? Лежи в палате, отдыхай, не напрягайся.

turtle_bazon ★★★★★
()
Ответ на: комментарий от anonymous

Макросы можно считать частным случаем рефлексии

Нет, нельзя. Не все, что можно сделать макросами, можно сделать рефлексией.

anonymous
()
Ответ на: комментарий от newjsser

Миксины к макросам никакого отношения не имеют.

Вообще-то, миксины имеют непосредственное отношение к макросам, так как практически полностью (если не полностью) эмулируют их действие, и прямое отношение к метапрограммированию. По крайней мере, я ещё не смог написать пример с макросами в Rust, чтобы его нельзя было бы сэмулировать с помощью миксинов на D. Самое интересное то, что код с миксинами обычно получается примерно в два раза короче, чем с реальными макросами. Что ещё могу добавить: у макросов Rust'а ужасный синтаксис, миксины D немного трудно понять новичкам (желательно иметь какой-то опыт программирования на D, чтобы понять миксины с наскока). А вообще миксины — это простая кодогенерация из строки. Благодаря чему это возможно? В D встроен мощный интерпретатор времени компиляции.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.