|
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
||||||||||||||||||||||||||||||||
C++ vs Common Lisp: кодогенерация, метапрограммирование25.03.2017, 11:14. Показов 6250. Ответов 64
Дано описание произвольного математических выражений на XML вида:
Задача: в compile time сгенерировать функцию, аргументами которой будут все var имена переменных из xml. Функция должна вычислять выражение описанное в xml. Такой простой eDSL. У нас есть 2 стула: Common Lisp и "всемогущий" C++. Я сажусь на первый стул. Беру первый попавшийся xml parser - xmls. Долблю на коленке кодогенератор.
Использую.
Но подождите? Ведь есть второй кошерный стул - кресты. Темплейты, туда сюда. Что же мне делать? Как решить задачу? Добавлено через 2 минуты hoggy, есть чё на лурке по этому поводу? Добавлено через 5 часов 28 минут
0
|
||||||||||||||||||||||||||||||||
| 25.03.2017, 11:14 | |
|
Ответы с готовыми решениями:
64
Common Lisp vs D Common Lisp vs D (2) Книги или другой источник, где описана история версий Lisp и Common Lisp |
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
| 25.03.2017, 16:49 | |
|
nullxdth, отлично, давай чуть обобщим задачку на то, как бы она выглядела в реальном мире.
Например - значения некоторых переменных лежат в Cassandra, а xml содержит алиасы вложенных объектов-выражений, которые приходят в очереди кластера RabbitMQ (ну или Kafka). Естественно, нужно поддерживать все адекватные фичи, относящиеся как минимум к высокодоступности и отказоустойчивости. Ну и например, если выражение большое, мы еще должны спрашивать по каким-то параметрам (фазы луны?) у внешнего сервиса (который использует grpc на http2 и protobuf3), нужно ли нам это действительно считать. Код писать не надо, просто изменится ли принципиально текущий код, а также какие либы нужно будет заюзать и почему именно их.
0
|
|
|
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|||
| 25.03.2017, 20:07 [ТС] | |||
|
Добавлено через 1 минуту
0
|
|||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||
| 25.03.2017, 20:20 | ||
|
0
|
||
|
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|||
| 25.03.2017, 20:40 [ТС] | |||
|
Добавлено через 11 минут
0
|
|||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||||
| 26.03.2017, 00:22 | ||||
|
Добавлено через 2 часа 11 минут Но если очень хочется, то на плюсовых constexpr'ах можно че-нить написать, но это конечно нетривиально будет
0
|
||||
|
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|||
| 26.03.2017, 00:35 [ТС] | |||
|
0
|
|||
|
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
|
|
| 26.03.2017, 01:42 | |
|
0
|
|
| 26.03.2017, 02:00 | ||||||||||||||||||||||||||||
![]() Тогда я тоже приму участие в регате - вручную, без единого гвоздя и безо всяких парсеров и библиотек. Для начала тройка утилитарных однострочных макросов/функций, с тривиальной семантикой:
Проверим:
Безо всяких библиотек, парсеров/шмарсеров и т.п. Правда, для Кассандры/Кролика/Кафки придется джавалибы подключать.
0
|
||||||||||||||||||||||||||||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
||||||
| 26.03.2017, 03:04 | ||||||
|
Ни на чё не претендую, просто интересно было реализовать
Кликните здесь для просмотра всего текста
0
|
||||||
| 26.03.2017, 05:23 | |||||||||||
|
Продолжение регаты - накостылил чтение из строки в конс-список (тип данных моего языка) через джавовские методы, осталось впилить в ядро полезную функцию чтения типа из строки - и все будет работать еще проще
Причем, все эти методы просятся в стандартную библиотеку, так что в финальном коде будет всего несколько строчек.
ЗЫ кстати, раз уж пошла такая регата, а в эту тему могут заглядывать знатоки лиспов - как мне назвать встроенную функцию языка, которая принимает строку, а возвращает распарсенное значение? Я бы назвал ее read, но у меня уже есть такая функция, и она делает ровно то же самое, только берет входную строку не из переданного параметра, а из блокирующего пользовательского ввода, и уже есть некоторая кодовая база, которую хочется оставить работоспособной. Я конечно понимаю, что с самого начала не заботился вопросами совместимости с распространенными диалектами Лиспов, и теперь уже поздно пить Боржоми (хотя какой-никакой транслятор в Scheme все-таки накостылен) Что насчет read-string?Добавлено через 53 минуты Собственно, зафигачено Теперь все работает полностью как надо безо всяких натяжек. И теперь можно признаться, что в первой версии ручного велосипедного парсера есть принципиальная ошибка, но чем ее устранять, проще воспользоваться стандартным парсером ядра ![]()
0
|
|||||||||||
|
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
|
|
| 26.03.2017, 10:18 | |
|
0
|
|
|
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
|
||
| 26.03.2017, 11:18 | ||
|
0
|
||
|
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
||
| 26.03.2017, 11:44 [ТС] | ||
0
|
||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||||||
| 26.03.2017, 17:09 | |||||||
Добавлено через 14 минут
0
|
|||||||
| 26.03.2017, 17:48 | ||
|
Спасибо всем ответившим.
korvin_, наверное можно было бы, но я пока не представляю как Сейчас у меня в вычислитель передается объект, реализующий интерфейс InOutable, с методами In и Out, через которые вычислитель общается с текстовым внешним миром. А как конкретный объект реализует эти методы - его личное дело. Консольный вариант - System.in / out, гуевый - по-своему, ботовый - по-своему. А чтение-парсинг объекта из строки не привязано к вводу/выводу, и живет внутри эвалюатора.nullxdth, то-что-надо, я подозревал, что в каких-то диалектах обязательно должна быть такая функция, значит ввод у меня будет отчасти по Common-Lisp-овому Тем более что с read из потока я угадал. Только вычислять длину строки и передавать аргументами позиции начала и конца парсинга - вот это уже я думаю будут именно сомнительные фичи, как говорил оратор выше. Это я и чисто строковыми функциями (с подкапотным вызовом джавовских методов) могу предварительно и отдельно делать.Добавлено через 5 минут ЗЫ у меня сейчас эта функция чтения уже сделана полиарной - если ей передана одна строка, то возвращается один прочитанный объект, если несколько - то она читает каждую и возвращает список прочитанных объектов. Это продолжает выбранную философию моих call-conventions, когда все особые формы, какие можно логично и непротиворечиво сделать полиарными (начиная с def / cons и заканчивая read / print), сделаны полиарными.
0
|
||
|
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
|
||
| 26.03.2017, 18:29 | ||
|
Вот и реализуй для строки Inable.
0
|
||
| 26.03.2017, 18:44 | ||
Вообще-то можно и общий интерфейс для строки реализовать, а в качестве Out просто конкатенировать в хвост. Но придется немного переделывать вызов - сейчас у меня нет в качестве входящего параметра print/read "дескриптора объекта чтения/записи", он берется по умолчанию один на текущее вычисление. А если сделать его явно указываемым, тогда можно будет выбирать куда писать/откуда читать в каждом конкретном вызове - клавиатура/экран, бот чат-канала, файл на диске или собственно строка. Не знаю, буду ли в ближайшее время это пилить, но фича интересная, да.
0
|
||
|
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
||
| 27.03.2017, 11:31 [ТС] | ||
|
Добавлено через 1 минуту TopLayer, спасибо. Попробую разобраться.
0
|
||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
| 27.03.2017, 12:36 | |
|
0
|
|
| 27.03.2017, 12:36 | |
|
Помогаю со студенческими работами здесь
20
Common Lisp Common lisp Common lisp ООП Common Lisp Вопрос по common lisp Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|