VE>Что тут читать. Я бы мог вспомнить про правила перезаписи, или про то, что какая-нибудь Agda, имея на руках VE>
VE>proof : ∀{f g} → map f ∘ map g ≡ map (f ∘ g)
VE>
VE>могла бы проводить оптимизации (те же правила перезаписи, только с док-вом корректности), но ты же это макросами сейчас обзовёшь.
Определение говорит, что map f не изменяет контекст, в котором происходит вычисление. По сути, декларация чистоты map и чистоты f. Это имеет отношение к системе типов, которая содержит информацию, позволяющую компилятору проводить подобные перезаписи. Система типов и макроподсистема ортогональны, на мой взгляд, и могут спокойно сосуществовать в рамках одного языка, потому, сравнение в данном случае некорректно.
VE>Понимаешь ли, if-else\for\while, например, могут быть реализованы на макросах, но сами по себе не макросы.
Тут готов поспорить. if-else,for,while — привычные, захардкоженные в большинство языков макросы. Ещё более неявный и привычный макрос — оператор доступа к членам '.' в C#, VB.NET, и т.д. Этот оператор ведёт себя совершенно по-разному в зависимости не только от типов стоящих слева и справа от него, но ещё и от реальных значений, если такие подразумеваются. Например в C# он может NullReferenceException кинуть, если слева reference-тип, с значением null. А может вообще ничего не сделать, если слева namespace и справа namespace. Причём за историю C# функциональность этого макроса расширяли, например в C#3 он научился находить Extension-методы, и не кидает NullReferenceException в случае если вызывается именно extension-метод.
Даже если вместо языка высокого уровня взять например ассемблер, то
ADD AX, [BP+2] — тоже сплошь состоит из макросов.
В итоге получается что любой язык программирования это какой-то набор жёстко захардкоженных макросов.
VE>Понимаешь ли, if-else\for\while, например, могут быть реализованы на макросах, но сами по себе не макросы.
Из всего этого дела, только if-else — особая форма в энергичном языке. Все остальное сахар, только в одних языках он захардкожен в компилятор, а в других имеются возможности красиво из выразить.
Здравствуйте, VladD2, Вы писали:
VD>Мне кажется этот фактор сам собой разумеющийся. Намечтать можно что угодно. А гипотетические научные работы обычно не выходят не то что на промышленный уровень, но вообще остаются непригодными для использования.
Это так. Но на фоне "метасвязок" — этот фактор — решающий.
_>Даже если вместо языка высокого уровня взять например ассемблер, то _>ADD AX, [BP+2] — тоже сплошь состоит из макросов.
И приравняли Nemerle к ассемблеру.
_>В итоге получается что любой язык программирования это какой-то набор жёстко захардкоженных макросов.
Ага, а компилятор — это всего лишь один сложный макрос.
Так нельзя, надо иметь четкое определение, что такое макрос или, по крайней мере, что подразумевается под ним применительно к Nemerle. В противном случае бессмыслица и демагогия получаются.
STD>И приравняли Nemerle к ассемблеру.
Нет. Приравнял ассемблер к транслятору набора захардкоженных макросов в двоичный код какой-то архитектуры. Соответственно Nemerle _может_ быть ассемблером.
_>>В итоге получается что любой язык программирования это какой-то набор жёстко захардкоженных макросов. STD>Ага, а компилятор — это всего лишь один сложный макрос.
Нет. Обычный компилятор — парсер и транслятор некоторого неизменяемого набора макросов.
STD>Так нельзя, надо иметь четкое определение, что такое макрос или, по крайней мере, что подразумевается под ним применительно к Nemerle. В противном случае бессмыслица и демагогия получаются.
Ну это работа теоретиков, пока я вижу только что любой язык делится на описание типов и макросов. Причём макросы могут создавать новые типы. Соотвественно макросы это не типы
Здравствуйте, STDray, Вы писали:
STD>Из всего этого дела, только if-else — особая форма в энергичном языке. Все остальное сахар, только в одних языках он захардкожен в компилятор, а в других имеются возможности красиво из выразить.
Да и if/else тоже может быть сахаром. В том же немерле это именно так. В немерле базовой конструкцией ветвления является match. Но в приципе ее вообще может не быть, если макрос сможет переписываться в более низкоуровневый язык.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, STDray, Вы писали:
STD>Определение говорит, что map f не изменяет контекст, в котором происходит вычисление. По сути, декларация чистоты map и чистоты f. Это имеет отношение к системе типов, которая содержит информацию, позволяющую компилятору проводить подобные перезаписи. Система типов и макроподсистема ортогональны, на мой взгляд, и могут спокойно сосуществовать в рамках одного языка, потому, сравнение в данном случае некорректно.
А кто сказал, что макросы не могут создавать собственные системы типов?
Н2 вообще будет построен на создании собственных систем типов заточенных под задачу.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
STD>>Из всего этого дела, только if-else — особая форма в энергичном языке. Все остальное сахар, только в одних языках он захардкожен в компилятор, а в других имеются возможности красиво из выразить.
VD>Да и if/else тоже может быть сахаром. В том же немерле это именно так. В немерле базовой конструкцией ветвления является match. Но в приципе ее вообще может не быть, если макрос сможет переписываться в более низкоуровневый язык.
Я имел в виду, что необходима конструкция, которая будет отложено вычислять свои аргументы. В Nemerle это матч, потому через него выражают if-else, но могло быть и наоборот. Имея на руках рекурсию и подобную конструкцию, можназделоть все остальные. Если макрос сможет переписываться в более низкоуровневый язык, значит енто компилятор.
WH>А кто сказал, что макросы не могут создавать собственные системы типов?
Не знаю. В любом случае, ключевая роль системы типов в данном примере не изменится от того, как эта система была получена.
WH>Н2 вообще будет построен на создании собственных систем типов заточенных под задачу.
В рамках N2 описываются полноценные языки, со своими компиляторами. Макросами их назвать сложно.
Здравствуйте, hi_octane, Вы писали:
VE>>А есть какой-то критерий, как понять, понял я макросы или нет? Ну кроме очевидного "в восторге от них — значит понял".
_>Каждый раз когда применяется какой-то макрос, язык становится немного более DSL.
DSL вон и на C++ пишут. Выглядит это, конечно, уродски, но ставить знак равенства между DSL и макросами несколько ошибочно.
Здравствуйте, VladD2, Вы писали:
VD>Судя по твоим словам можно предположить, что не понял. Даже можно более сильное утверждение сделать. Ты зачем-то ищешь обоснование для того чтобы не разбираться, что это такое и что это дает.
Прекращай телепатировать, меня WolfHound спросил, я ответил. Ответ вас не устроил и вы теперь убеждаете меня, что я не разобрался, так ещё и ищу основание для того, чтобы не разбираться. У вас уже совсем евангелизм способность читать поел.
Здравствуйте, VladD2, Вы писали:
VD>Не уверен. Уловил, что скорее всего речь идет о трасформации кода. До ≡ идет паттерн распознающий некое выражение, а после ≡ идет паттерн формирующий переписанное выражение. При этом f и g это аналоги сплайсов в квази-цитатах, т.е. на их месте может быть произвольный код (или произвольная функция, что несколько более примитивно).
Нет.
data _≡_ {a} {A : Set a} (x : A) : A → Set a where
refl : x ≡ x
Просто тип данных. Можешь сам таких написать с десяток.
VD>Короче на лицо описание трансформации кода.
На лицо твоё непонимание.
VE>> Это, если что, просто декларация значения определённого типа, такая же, как VE>>
VE>>some :: ∀{a} → maybe a
VE>>some = nothing
VE>>
VD>Да ну? А где же ≡ ? Ой обманываешь ты меня, явно.
VD>Думаю, что все дело в "≡". Без него это будет обычный тип. С ним не обычный.
Ты смешон. Обвиняешь всех огульно в нежелании разбираться, а сам везде видишь паттерны и макросы "вид сбоку".
Здравствуйте, STDray, Вы писали:
STD>Система типов и макроподсистема ортогональны, на мой взгляд, и могут спокойно сосуществовать в рамках одного языка, потому, сравнение в данном случае некорректно.
Конечно может, конечно ортогональны, а вот почему это Влад назвал "макросы вид сбоку", это у него спросить надо.
Здравствуйте, STDray, Вы писали:
VE>>Понимаешь ли, if-else\for\while, например, могут быть реализованы на макросах, но сами по себе не макросы. STD>Из всего этого дела, только if-else — особая форма в энергичном языке. Все остальное сахар, только в одних языках он захардкожен в компилятор, а в других имеются возможности красиво из выразить.
Ну вот в agda это просто оператор if_then_else_. Красиво? А я ещё могу в if проверить непустоту списка, а в ветке then использовать функцию head (голова списка), так как в then-ветке известно, что список не пуст и head можно применить. Никаких макросов, просто функции.
Так что не макросами едиными.
VD>Вот только сегодня гугль принес ссылку на новый проект на немерле. Это какая-то студенческая работа из Италии. В ней не было бы ничего интересного кроме того, что по ней можно четко скзать, что человек создавший этот проект использовал Немерл как C#++. Фактически это добротный код C#-код с синтаксисом немерла и использованием готовых макросов (в частности, самый мощный C#-парсер созданный с использованием макроса Nemerle.Peg.
VD>В коде этого проекта не только нет своих навороченных макросов, но и сам язык используется далеко не на всю катушку.
Мне эту ссылку принес вчера твиттер И вот что сказал автор по поводу странного использования немерла:
Автор: just migrated http://code.google.com/p/cs2project/ to #nemerle. cool language
Я: Why do you not use any of the Nemerle unique features but just port the code almost line-by-line?
Автор: Simple reason, I first migrated the code as-is, and now I'm starting to learn the language. And liking it so far!
И согодня добавил: Have a look at the current state of the repo,any suggestions are highly appreciated,even if it's my first approach to Nemerle
Здравствуйте, VoidEx, Вы писали:
VE>Прекращай телепатировать, меня WolfHound спросил, я ответил. Ответ вас не устроил и вы теперь убеждаете меня, что я не разобрался, так ещё и ищу основание для того, чтобы не разбираться. У вас уже совсем евангелизм способность читать поел.
И твой ответ содержал 0 аргументов.
И все твои последующие сообщения тоже не содержат ни одного аргумента.
Я, честно говоря, вообще не помню твоих сообщений с содержанием по существу. А не трёп с кучей голословных утверждений.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
VE>DSL вон и на C++ пишут. Выглядит это, конечно, уродски, но ставить знак равенства между DSL и макросами несколько ошибочно.
Считается что нужно иметь очень развитый язык, на котором можно написать любую программу. Но каждый раз когда пишется какая-то программа, реально нужно только то что выражает уникальную логику присущую только этой программе. Утрированно — допустим я пишу математическую функцию, в которой используются только *,+, sin(x). И у меня есть реализация этих операторов на макросах, которая пихает это всё в GPU. Сможешь тут отделить макросы от DSL?
Разделение DSL/макросы это просто привычка, вызванная тем что сначала появились некие зашитые в компилятор "типы, функции, операцации, операторы, и т.п.", а понимание того что они все являются только способами переписывания кода из одной формы в другую пришло сильно позже. Вот макросы и есть переписывание кода из одной формы в другую в чистом виде. Что тогда остаётся в программе кроме макросов и типов?