Неужели ты думаешь, что в лиспе нет векторов, хеш-таблиц, что нельзя создавать свои типы данных, такие как деки и деревья? Не будь таким наивным. Это даже в чистом хаскеле есть. Там императивная монада IO позволяет делать практически все такие же структуры данных, что есть в си++ - и, что важно, будет работать примерно с той же скоростью (IO хорошо оптимизируется).
Кстати, деки и упорядоченные деревья должны существовать в виде разных библиотек в лиспе, но мне, вот, понадобились иммутабельные двоичные черно-красные сбалансированные деревья, которых нет в стандарте - и я с легкостью их создал.
Тем не менее, есть разница в выборе выразительных средств, разница в том, как можно писать на лиспе и как на си++. Впрочем, надо признаться, что сейчас есть много лисперов, которые не знают и не признают ФП, и даже этим немного гордятся (let over lambda).
Для твоей начальной задачи сгодились списки (a-lists), и их выбор был правильным. Для новой озвученной тобою задачи, очевидно, нужны другие структуры данных, но это же банальность. Какой смысл к банальности придираться?
Да, ещё функции/классы в C++ не являются 'first class values'. Необходимость вникать в принципы ООП, всякие шаблоны/итераторы, чтобы хотя бы применять грамотно STL.
необходимостью заботы о выделении/высвобождении памяти.
я выше ни одного new/delete не написал в своих примерах, и в реальном коде тоже практически с ними не сталкиваюсь, так что тут нет необходимости, есть разные стратегии работы с памятью
Манипуляциями с указателями/ссылками(и различными тонкостями, связанными с этим, как например при передаче аргументов в функцию — происходит их копирование).
*,& - нет копирования, работаем с оригинальным объектом, ничего - есть копирование, куда уж проще, ну и назовешь сходу разницу между insert-after и ninsert-after в CL?
Неужели ты думаешь, что в лиспе нет векторов, хеш-таблиц, что нельзя создавать свои типы данных, такие как деки и деревья? Не будь таким наивным
я знаю, что там много чего нет, а то, что можно создавать - везде можно
Для твоей начальной задачи сгодились списки (a-lists), и их выбор был правильным. Для новой озвученной тобою задачи, очевидно, нужны другие структуры данных, но это же банальность.
окай, сделаем вид, что кому-то действительно нужно сложить a+b+c+1+2, нет проблем, везде используем alist, теперь проект вырос, данных стало больше, alist тормозит - надо заменить на hash tables или свою уникальную реализацию, твои действия по поводу кода, который уже работает с alist?
Я смотрю, ты любишь задавать вопросы. Похвальное дело :)
На счет того, что в лиспе много чего нет. В общем, да. Но я решил для себя так: всегда можно подключить сишный код. Это как нулевое решение, крайний случай. Поэтому особой проблемы и нет. Да и редко бывает так, что под задачи есть готовый алгоритм или структура данных. Обычно я их сочиняю. Беру идеи из других как кирпичики и составляю под себя, благо образование позволяет (выпустился как прикладной математик). Поэтому здесь проблемы практически не испытываю, кроме одной: со временем начал забывать математику.
ну про deque и hash tables никто не привел кода на CL, для первого сказали - нету, для второго - будет не так красиво набивать данные, обратный пример я приводил, без проблем приведу другие, если кто предложит задачку
insert-unique это макрос, который принимает строку, содержащую имя таблицы в mysql и переменные в CL, совпадающие по имени с именами колонок в таблице mysql.
Ты правда так делаешь? Правда пишешь такие макросы? И у тебя нормальные отношения с коллегами? Мдя...
И еще, на STL макросы не пишут. Макросы в сишечке только с текстом работать умеют, потому их избегают. Но оно и к лучшему, в лиспе я бы тоже руки отрывал за макросы(хотя там они не тупые, да)...
Функции и классы не должны быть first class values. Это никому ненужное извращение. Если хочешь поизвращаться - делай это самостоятельно, а в язык не надо пихать такие штуки. Тем более, что они нарушат принцип нулевой стоимости... Для функций есть лямбды, std::function, std::bind и пр. Для типов - пиши свое(ну или Qt используй, там почти что так для Q-типов).
вероятно как-то так, но я б так не писал, просто потому-что завязываться на имя переменной - неправильно и чревато ошибками, я б жестко забил имена в структуру:
host h;
h.name = "localhost";
h.port = 80;
int id = mk_host( h );
Ты наврал. Если ты пишешь auto у функции, то должен указать тип потом, через ->. И даже decltype ты не заюзаешь, ибо он не работает для лямбда-выражений(вот такой вот «вывод типов», как всегда плюсовики херню придумали). Придется возвращать std::function, а это минимум еще одно копирование/перемещение).
Дело не во вкусе. Замыкание предполагает работу с замыкаемым объектом, а в твоем коде это не так - ты будешь копировать. Для смартов тебе придется юзать динамическую память, а это в С++ медленно, GC же нет...
Строка будет скопирована в замыкание, а если строка большая? Почему, кстати, он ее не перемещает, а именно копирует? Правильно, потому что строку могут дальше использовать, а учесть то, что строка больше не нужна компилятору в данном случае не так просто... Да и не обязан ли он именно копировать по стандарту?
Так вот именно. У тебя итак буфер под строку, да еще и саму строку зачем-то в динамическую память пихать - не С++но это... Тем более, что как раз с маленькими объектами дефолтный распределитель херово работает.
Как раз наоборот, на твоих синтетических тестах разница невелика(но она есть), а вот в реальной жизни все это заметнее. Но не в том дело. Речь о том, что копирование - это не замыкание по определению. А замыкание по ссылке приводит к падению во многих случаях. Так о полноценных замыканиях, как в других языках(даже в D!), в С++ и речи быть не может.
чистая фантазия, я как раз в реальной жизни постоянно использую профайлеры, да - бывают проседания в неожиданных местах, но никогда не видел таковых на умных указателях или std::function
Речь о том, что копирование - это не замыкание по определению. А замыкание по ссылке приводит к падению во многих случаях
да, он имел недостатки, причем не самые очевидные, потому его и заменили, С++ вообще далеко не идеален, кстати ты вроде присматривался к Rust - однозначное мнение уже есть?
Вот именно. Настолько неочевидные, что даже весьма квалифицированные люди, работавшие над стандартом, их сначала допустили, а потом чуть не прохлопали.
Вся мощь и гибкость Си++ достигается комбинацией низкоуровневых опасных средств, и пока из осколков стекла сложишь мозаику - все пальцы изрежешь.
Rust - однозначное мнение уже есть?
Нет. С одной стороны, прекрасные намерения, система типов впечатляющая (хотя исследовательская работа по ней еще не завершена), с другой - нет исключений и обработка ошибок увязана с параллельностью, нетривиальный рантайм. Но rust-dev@ читать интересно.
Вот именно. Настолько неочевидные, что даже весьма квалифицированные люди, работавшие над стандартом, их сначала допустили, а потом чуть не прохлопали.
а где не бывает ошибок? про любую ошибку/кривость в популярных ЯП можно так сказать
Вся мощь и гибкость Си++ достигается комбинацией низкоуровневых опасных средств, и пока из осколков стекла сложишь мозаику - все пальцы изрежешь.
единственное опасное средство как по мне - (полу)ручная работа с памятью, в С++17 планируют добавление GC, если доживем и ничего больше не взлетит - посмотрим, что получится
про любую ошибку/кривость в популярных ЯП можно так сказать
Даже и близко не про любую.
Вся мощь и гибкость Си++ достигается комбинацией низкоуровневых опасных средств
единственное опасное средство как по мне - (полу)ручная работа с памятью
_Комбинацией_ _низкоуровневых_ _опасных_ средств. Все три слова важны. Результат - известные загадки Саттера, которые, в сущности, имеют весьма логичные отгадки - после того, как запустишь wetware-интерпретатор Си++.
в С++17 планируют добавление GC
Вангую, что оно будет обвешано кучей малозаметных нетривиальных ограничений.
надо разделять о чём спор. О 'языках' или о их конкретных 'реализациях' или о доступных для них библиотеках или обо всём сразу.
ЯП это инструмент. Как молоток, или пассатижи, или микроскоп. Спорить о том какой ЯП абстрактно круче вне контекста конкретных задач так же глупо, как спорить о том что круче - молоток или пассатижи? Или все таки микроскоп?