C++
Строки.
Они не совместимы со строками платформы, таким образом, Вы заканчиваете тем, что использовали станд.:: векторная половина времени. Политика копии (копия на записи или глубоко копируют) не определяется, таким образом, гарантии исполнения не могут быть даны для простого синтаксиса. Иногда они полагаются на алгоритмы STL, которые не очень интуитивны для использования. Слишком много библиотек прокручивают свои собственные, которые, к сожалению, намного более удобны для использования. Если Вы не должны комбинировать их.
Множество строковых представлений
Теперь, это - что-то вроде проблемы платформы - но я все еще надеюсь, что было бы лучше, когда менее упрямый стандартный строковый класс будет доступен ранее. Следующие строковые представления я часто использую:
модель Build.
я болен к смерти от все время потраченного запутывания вокруг с who-includes-what, предописаниями, оптимизация предварительно скомпилированных заголовков и включаю для хранения, по крайней мере, возрастающего времени изготовления терпимым и т.д. Это было большим в восьмидесятых, но теперь? Существует столько препятствий к собиранию части кода, таким образом, это может быть снова использовано, что даже собака мам скучает, слушая меня.
Трудно для парсинга
Это делает внешние инструменты особенно трудно, чтобы записать, и разобраться. И сегодня, мы парням C++ недостает главным образом набора инструментальных средств. Я люблю свое отражение C# и делегатов, но я могу жить без них. Без большого рефакторинга я не могу.
Поточная обработка слишком трудна
, Язык даже не распознает его (к настоящему времени), и свободы компилятора - в то время как большой - к болезненному.
Статическая и инициализация по запросу Технически, я обманываю здесь: это - другая часть загадки в, "оборачивают код для повторного использования": это - кошмар для получения чего-то, инициализировал только, когда это необходимо. Лучшее решение всех других redist проблем бросает все в заголовки, эта проблема говорит "neeener - Вы не можете".
Предоставленный, многое из этого вне строгого объема языка, но IMO весь набор инструментальных средств должен быть оценен и должен развиться.
Канал # cl-gardeners на Freenode предлагает выполнить привязку цикла деструктуризации следующим образом:
(loop for (a . b) in *mapping*
do (format t "~a: ~a" a b))
Вы правы, в этом не похоже, что есть какой-либо способ выделить cons-ячейку из FORMAT.
Если вы определяете другую функцию для форматирования единственной ассоциации:
(defun print-assoc (stream arg colonp atsignp)
(format stream "~A: ~A" (car arg) (cdr arg)))
тогда это просто:
(format t "~{~/print-assoc/~%~}" *map*)
Я не уверен, улучшение это или нет. С одной стороны, это немного сложнее, но с другой стороны, оно разбивает print-assoc на (многоразовую) функцию, которая может быть полезна.
Я думаю, что главный урок здесь состоит в том, чтобы не использовать точечные списки для ваших списков. Конечно, вы сохраняете одну cons-ячейку, но отказываетесь от всех хороших функций последовательности и списков. Просто оно того не стоит. Ваш пример форматирования тривиален с полностью сформированными списками:
(defvar *map* '((0 "zero") (1 "one") (2 "two")))
(format t "~:{~a: ~a~}" *map*)
Я не думаю, что есть лучший способ сделать Это; Я бы использовал map ()
:
(format t "~{~a~%~}"
(map 'list
#'(lambda (entry)
(format nil "~a: ~a" (car entry) (cdr entry))
*map*))