VD>Короче, для меня твои слова выглядят как толстый троллинг. Если в твои задачи не входит любой ценой доказать преимущества (которых явно нет) С++, то советую разобраться в вопросе по глубже. Причем не в теории, а на практике. Как только ты это сделаешь, то все вопросы отпадут сами собой.
бугага (особенно про троллинг)
я уже 2 (два, ДВА!) раза писал о проблеме с++ -- то, что шаблоны не все могут прочитать -- и теперь приходится писать об этом в третий раз
можно было бы уже и сделать вывод о том, что "в мои задачи не входит любой ценой доказать преимущества ... С++"
VD>Кстати, как показывает практика, именно из С++-ников получаются отличные немерлисты . Так что если ты пришел разобраться, то милость просим в наше братство. Мы тебе поможем и ты сможешь по достоинству оценить технологию.
я действительно пришел разобраться, пора уже
прошлые мои попытки разобраться путем чтения статей на rsdn и на сайте немерле года 2-3 назад провалились
т.е. сама по себе идея генережа в компайл-тайме (путем чтения и записи AST) здрава, и воспринимается влет; квазицитирование это по-моему слегка уход в сторону, но опять воспринимается легко
но вот конкретные описания что я читал... короче я их не понял, может потому, что мне нужен взгляд "с высоты птичьего полета", и вот уже в этой теме задаю вопросы про модель
VD>Если бы Вольфхаунд считал бы, что аналог его парсера можно было бы сделать на С++, то зачем бы ему вообще было связываться с Немерлом?
это не аргумент
но раз вы оба постоянно нажимаете на эту тему, давайте разберем ее подробнее
технология для этого емнип в с++ называется expression templates, подробнее я напишу вольфхауну
(да, это только первый ответ, дальше будут и другие)
Здравствуйте, m e, Вы писали:
ME>технология для этого емнип в с++ называется expression templates, подробнее я напишу вольфхауну
Можешь не трудиться. И про метаизвращения на шаблонах не хуже тебя знаю.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
WH> И про метаизвращения на шаблонах не хуже тебя знаю.
тогда скажу то, что возможно ты не знаешь
на с++11 стало можно статически получать доступ к содержимому строковых литералов, скажем можно написать
auto r = "[a-z]+[a-z0-9]+"_regex;
и распарсить рег.выр. в компайл-тайме (оно передается посимвольно как аргумент вариадического шаблона)
да, кстати, на уровне выражений получать АСТ вместо значения емнип можно и в скале, и одерски трудился, городил что-то похожее на expression templates на имплицитах
еще в с++ можно получать АСТ без "шума" на запихивание литералов в свой класс, т.к. литерал уже класс
WH>Можешь не трудиться.
хм, не трудиться...
я уж мягко предложил владу отказаться от *последующих* его явно неверных выпадов в адрес с++, но он не стал это делать
проблема в том, что влад и в меньшей степени ты записываете в уникальные достоинтства немерле то, что делается на с++, и при том, что достоинтства немерле перед с++ и правда имеются, и даже были мной упомянуты
впрочем, предложение принимаю, при условии отсутствия последующих явно неверных высказываний в адрес с++... все же мне как-то больше нравится просветляться самому, чем Нести Просветление В Массы
кстати -- в немерле можно получить доступ к значению строкового литерала в компайл-тайме?
VD>Если он обобщенный, то проверять ты будешь не левых тип Х который по имени будешь искать, а параметр типов. VD>Меня интересует смысл именно этого кода. Я его не могу уловить.
а в немерле есть принципиальная разница -- тип известен как параметр шаблона (или там-его-аналого), или просто по имени?
Здравствуйте, m e, Вы писали:
ME>проблема в том, что влад и в меньшей степени ты записываете в уникальные достоинтства немерле то, что делается на с++, и при том, что достоинтства немерле перед с++ и правда имеются, и даже были мной упомянуты
Разница между шаблонами С++ и макросами немерле как между машиной Тьюринга и промышленным языком программирования.
В теории на МТ можно сделать все. Но на практике задолбаешься так что
ME>кстати -- в немерле можно получить доступ к значению строкового литерала в компайл-тайме?
И после этого ты хочешь сказать что читал статьи по намерле? http://nemerle.org/wiki/index.php?title=SQL_macros
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, m e, Вы писали:
ME>а в немерле есть принципиальная разница -- тип известен как параметр шаблона (или там-его-аналого), или просто по имени?
Естественно. Одно дело искать тип (да еще по не полному имени), и другое обращаться к конкретному параметру типа.
Кроме того в Немерле нет шаблонов. Дженерики же работают в рантайме и анализировать парамер типов из этого типа особого смысла не имеет, так как он будет описывать только те констрэйны, что заданы и ничего не скажет о рантайм-типе.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, jazzer, Вы писали:
VD>>Меня интересует смысл именно этого кода. Я его не могу уловить.
J>Ну например, если у тебя есть поле типа char*, то автоматически добавляется поле с длиной строки.
Если бы ты вдумчиво прочел тему, то понял бы, что твой ответ не в кассу.
Вопрос был — зачем делать добавление членов в тип зависимым от чего-то из другого типа? Это может иметь смысл если язык дремуч как С++ и в нем ест инклюды. Но в модульном языке — это совершенно бессмысленно.
С параметрами типов дженериков это тоже смысл не имеет, так как из конкретные значения становятся доступны только в рнтайме. Так что осмыслен данный код может быть только для шаблонов. Но как раз то их в Н и нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, m e, Вы писали:
VD>>Вот это совершенно не разумня ссылка. Это материал для тех кто уже знает что такое макросы и хочет погрузиться по глубже.
ME>читать надо именно это, потому что предыдущие части похожи на жидкую манную кашу с кусочками гранита ME>а в 4-й хоть твердость примерно равномерная
Тебе ни одну из этих частей читать не надо. Это все равно что начинать учить С++ с Александревсковских трудов. Ничего не поймешь, и толку будет — 0.
И вообще, просто читать смысла нет. Надо пробовать. Прочти 5-ю часть
"Язык Nemerle", и если есть проблемы в понимании самого языка, то предыдущие части. Этого должно хватить для старта. Далее надо взять и написать, что-то своими руками.
Все скептики критикующие Н или не написали на нем ни строчки, или побаловались с примерами и забросили. Так что единственный вариант разобраться — это использовать его для реальных задач.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, jazzer, Вы писали:
VD>>>Меня интересует смысл именно этого кода. Я его не могу уловить.
J>>Ну например, если у тебя есть поле типа char*, то автоматически добавляется поле с длиной строки.
VD>Если бы ты вдумчиво прочел тему, то понял бы, что твой ответ не в кассу. VD>Вопрос был — зачем делать добавление членов в тип зависимым от чего-то из другого типа? Это может иметь смысл если язык дремуч как С++ и в нем ест инклюды. Но в модульном языке — это совершенно бессмысленно.
Я же привел пример — если в этом самом типе есть поле типа char*.
Причем тут инклюды, я вообще не понял. Какая разница, каким образом подключается информация о типах — через инклуд или как-то иначе?
Здравствуйте, VladD2, Вы писали:
VD>Все скептики критикующие Н или не написали на нем ни строчки, или побаловались с примерами и забросили. Так что единственный вариант разобраться — это использовать его для реальных задач.
Здравствуйте, jazzer, Вы писали:
J>Я же привел пример
А надо было для начала почитать обсуждение.
J>- если в этом самом типе есть поле типа char*.
Да какая разница какого типа поле? Вопрос был в том, зачем делать в одном типе что-то на основании того, что что-то есть в некотором другом типе, причем этот тип нужно искать по имени. Тут вопрос в том как получить такое имя и где такой подход может пригодиться.
J>Причем тут инклюды, я вообще не понял. Какая разница, каким образом подключается информация о типах — через инклуд или как-то иначе?
Притом, что только при условии, что код может включаться в проект по разному нужно какая-то условная генерация. И то трудно представить как это осмысленно использовать. Это уже какие-то варианты на тему условной компиляции.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, gandjustas, Вы писали:
VD>>Все скептики критикующие Н или не написали на нем ни строчки, или побаловались с примерами и забросили. Так что единственный вариант разобраться — это использовать его для реальных задач.
G>А есть примеры решения реальных задач на nemerle?
Это офтопик. Да и отвечать по сотому разу на один и тот же вопрос довольно глупо. Примеров масса. Все кого в гуле не забанили должны найти. Если уж с гуглем совсем проблемы, заходишь в соответствующий форум и задаешь вопрос.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
ME>>а в немерле есть принципиальная разница -- тип известен как параметр шаблона (или там-его-аналого), или просто по имени?
VD>Естественно. Одно дело искать тип (да еще по не полному имени), и другое обращаться к конкретному параметру типа.
это надо было сразу сказать, не дожидаясь моего вопроса
тем не менее, это похоже мало что меняет и мне не понятно -- lookup по неполному имени должен быть реализован в компиляторе -- тогда почему он плохо доступен?
VD>Кроме того в Немерле нет шаблонов. Дженерики же работают в рантайме и анализировать парамер типов из этого типа особого смысла не имеет, так как он будет описывать только те констрэйны, что заданы и ничего не скажет о рантайм-типе.
а если параметром дженерика идет value type как в дотнете, то дженерик специализируется под него или нет?
Здравствуйте, m e, Вы писали:
ME>это надо было сразу сказать, не дожидаясь моего вопроса
Не уже ли это не очевидно?
ME>тем не менее, это похоже мало что меняет и мне не понятно -- lookup по неполному имени должен быть реализован в компиляторе -- тогда почему он плохо доступен?
Он и реализован. Но надо понимать о чем говоришь. Чтобы делать связывание не полного имени нужно иметь окружение в котором описаны открытые пространства имен и типы. В Немерле это называется GlobalEnv. Он автоматически формируется парсером и присваивается ко всему что может иметь в себе ссылки на имена.
VD>>Кроме того в Немерле нет шаблонов. Дженерики же работают в рантайме и анализировать парамер типов из этого типа особого смысла не имеет, так как он будет описывать только те констрэйны, что заданы и ничего не скажет о рантайм-типе.
ME>а если параметром дженерика идет value type как в дотнете, то дженерик специализируется под него или нет?
Немерли есть дотнет. И в дотнете для дженериков предусмотрены исключительно констрэйны. Специализируются же дженерики уже в рантайме (самим рантаймом). По этому изнутри дженерика невозможно узнать реальный тип (разве что через рефлексию).
В местах применения дженерик-типов можно узнать что аз параметр типов задан дженерик-типу. Но не из самого дженерика.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
"Язык Nemerle", и если есть проблемы в понимании самого языка, то предыдущие части. Этого должно хватить для старта. Далее надо взять и написать, что-то своими руками.
5-ю я вообще не видел, но см. ниже
VD>Все скептики критикующие Н или не написали на нем ни строчки, или побаловались с примерами и забросили. Так что единственный вариант разобраться — это использовать его для реальных задач.
меня не устраивает этот якобы единственный вариант
мне нужно прочесть *описание* языка (я не говорю стандарт, хотя бы описание)
это значит, что хотя бы должна быть определена терминология -- т.е. все фазы компиляции должны быть названы словами русского или английского языка (а не названиями процедур, функций, энумов или х.з. чего из исходного кода), и называться везде одинаково -- скажем, фаза WithTypedMembers части 5-й соответствует какой из фаз 1-9 из http://www.rsdn.ru/article/nemerle/MacrosExtCoursePart4.xml
написано "6. Типизирует члены типов", заставляет вылезти из парсера, посмотреть, не сломался ли он, и продолжать движение вперед на скорости 5-10 км/ч
да, даже если "класс" и "тип" у вас одно и то же, то это как минимум непривычно; более того, я подозреваю, что у вас есть неклассовые типы, и должно было быть написано "6. Типизирует члены классов"
из описания языка должны быть выброшены куски исходного кода компилятора (хотя их конечно можно вынести на отдельные странички, на которые ведут ссылки из описания), и могут быть добавлены примеры на каждую фазу трансляции -- как выглядит полученное к тому времени AST
в целом, я думаю можно взять как раз последние части разных курсов, привести в порядок терминологию, может быть потребуется чуть пораскидать их куски по разделам и получится вполне пригодная к прочтению вещь
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, gandjustas, Вы писали:
VD>>>Все скептики критикующие Н или не написали на нем ни строчки, или побаловались с примерами и забросили. Так что единственный вариант разобраться — это использовать его для реальных задач.
G>>А есть примеры решения реальных задач на nemerle?
VD>Это офтопик. Да и отвечать по сотому разу на один и тот же вопрос довольно глупо. Примеров масса. Все кого в гуле не забанили должны найти. Если уж с гуглем совсем проблемы, заходишь в соответствующий форум и задаешь вопрос.
Не интересует не просто примеры кода, а именно примеры приложений. Даже если не очень настоящих, но тем не менее готовых и работающих. Именно приложений, а не библиотек.
ME>>это надо было сразу сказать, не дожидаясь моего вопроса
VD>Не уже ли это не очевидно?
ME>>тем не менее, это похоже мало что меняет и мне не понятно -- lookup по неполному имени должен быть реализован в компиляторе -- тогда почему он плохо доступен?
VD>Он и реализован. Но надо понимать о чем говоришь. Чтобы делать связывание не полного имени нужно иметь окружение в котором описаны открытые пространства имен и типы. В Немерле это называется GlobalEnv. Он автоматически формируется парсером и присваивается ко всему что может иметь в себе ссылки на имена.
да, неочевидно, и более того, неясно даже после твоего разъяснения -- *как* все это мешает вызвать уже имеющуюся функцию (лично для себя я предполагаю, что дело в фазах компиляции)
VD>В местах применения дженерик-типов можно узнать что аз параметр типов задан дженерик-типу. Но не из самого дженерика.
это решение выглядит более-менее обоснованным для ref types, но для значений -- нет
как мне написать дженерик, которому в качестве типа-параметра T можно подсунуть как float, так и double, но для того, чтобы закончить итерации, мне нужно внутри дженерика знать epsilon такой что