Как я мог бы отформатировать alist в языке Common LISP?

C++

  • Строки.
    Они не совместимы со строками платформы, таким образом, Вы заканчиваете тем, что использовали станд.:: векторная половина времени. Политика копии (копия на записи или глубоко копируют) не определяется, таким образом, гарантии исполнения не могут быть даны для простого синтаксиса. Иногда они полагаются на алгоритмы STL, которые не очень интуитивны для использования. Слишком много библиотек прокручивают свои собственные, которые, к сожалению, намного более удобны для использования. Если Вы не должны комбинировать их.

  • Множество строковых представлений
    Теперь, это - что-то вроде проблемы платформы - но я все еще надеюсь, что было бы лучше, когда менее упрямый стандартный строковый класс будет доступен ранее. Следующие строковые представления я часто использую:

    • универсальный LPCTSTR,
    • LPC (W) STR, выделенный CoTaskMemAlloc,
    • BSTR, _bstr _t
    • (w) строка,
    • CString,
    • станд.:: вектор
    • roll-my-own класс ( вздох ), который добавляет проверку диапазона и основные операции к (w) символу * буфер известной длины
  • модель Build.
    я болен к смерти от все время потраченного запутывания вокруг с who-includes-what, предописаниями, оптимизация предварительно скомпилированных заголовков и включаю для хранения, по крайней мере, возрастающего времени изготовления терпимым и т.д. Это было большим в восьмидесятых, но теперь? Существует столько препятствий к собиранию части кода, таким образом, это может быть снова использовано, что даже собака мам скучает, слушая меня.

  • Трудно для парсинга
    Это делает внешние инструменты особенно трудно, чтобы записать, и разобраться. И сегодня, мы парням C++ недостает главным образом набора инструментальных средств. Я люблю свое отражение C# и делегатов, но я могу жить без них. Без большого рефакторинга я не могу.

  • Поточная обработка слишком трудна
    , Язык даже не распознает его (к настоящему времени), и свободы компилятора - в то время как большой - к болезненному.

  • Статическая и инициализация по запросу Технически, я обманываю здесь: это - другая часть загадки в, "оборачивают код для повторного использования": это - кошмар для получения чего-то, инициализировал только, когда это необходимо. Лучшее решение всех других redist проблем бросает все в заголовки, эта проблема говорит "neeener - Вы не можете".

<час>

Предоставленный, многое из этого вне строгого объема языка, но IMO весь набор инструментальных средств должен быть оценен и должен развиться.

5
задан Michael 12 August 2009 в 01:17
поделиться

4 ответа

Канал # cl-gardeners на Freenode предлагает выполнить привязку цикла деструктуризации следующим образом:

(loop for (a . b) in *mapping*
  do (format t "~a: ~a" a b))
11
ответ дан 18 December 2019 в 06:51
поделиться

Вы правы, в этом не похоже, что есть какой-либо способ выделить cons-ячейку из FORMAT.

Если вы определяете другую функцию для форматирования единственной ассоциации:

(defun print-assoc (stream arg colonp atsignp)
  (format stream "~A: ~A" (car arg) (cdr arg)))

тогда это просто:

(format t "~{~/print-assoc/~%~}" *map*)

Я не уверен, улучшение это или нет. С одной стороны, это немного сложнее, но с другой стороны, оно разбивает print-assoc на (многоразовую) функцию, которая может быть полезна.

6
ответ дан 18 December 2019 в 06:51
поделиться

Я думаю, что главный урок здесь состоит в том, чтобы не использовать точечные списки для ваших списков. Конечно, вы сохраняете одну cons-ячейку, но отказываетесь от всех хороших функций последовательности и списков. Просто оно того не стоит. Ваш пример форматирования тривиален с полностью сформированными списками:

(defvar *map* '((0 "zero") (1 "one") (2 "two")))
(format t "~:{~a: ~a~}" *map*)
4
ответ дан 18 December 2019 в 06:51
поделиться

Я не думаю, что есть лучший способ сделать Это; Я бы использовал map () :

(format t "~{~a~%~}"
  (map 'list
    #'(lambda (entry)
      (format nil "~a: ~a" (car entry) (cdr entry))
    *map*))
1
ответ дан 18 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: