Common Lisp Concatenate и новая строка - PullRequest
1 голос
/ 11 февраля 2011

В настоящее время я пишу программу LISP, которая анализирует результаты CR в виде списков, таких как: ("I" 0 10 0 20) << (слово X0 X1 Y0 Y1) </p>

Она должна быть построенавесь текст, используя позиции слов.В моем коде есть кластерный анализатор, который обнаруживает кластерные макеты, такие как абзацы с выравниванием по левому краю или по правому краю или даже оба.Структура данных кластера выглядит следующим образом: («имя кластера» xline y0 y1 '(слова кластера))

Как добавить новую строку, пока я перебираю список строк и объединяю их в строку результатасоздать форматированный текст из этих?Пример:

"Hi,\n
\n
here is my entry\n
\n
Good bye"

Мой код выглядит следующим образом:

(defun print-formatted-text(txt)
  (let
      ((size   (array-total-size txt))
       (sorted (sort (sort txt #'compare-mix) #'compare-generic2))
       (result ""))
    (loop for i from 0 to (1- size) do
          (let ((el (aref sorted i)))
            (if (word? el)
                (setf result (concatenate 'string result (first el) " "))
              (if (null (nth 7 el))
                  nil
                (progn
                  (setf result (concatenate 'string result " "))
                  (dolist (curr (nth 7 el))
                    (setf result (concatenate 'string result (first curr) " "))))))))
    result))

Если текущие данные не являются словом, то это абзац.Это означает, что мне нужно добавить новую строку, прежде чем я произнесу слова абзаца и после.

Правильно ли здесь используется конкатенация?

Спасибо за советы.

Ответы [ 4 ]

6 голосов
/ 11 февраля 2011

Я не совсем понимаю вашу программу, но гораздо проще работать со строковыми потоками и использовать format, write-string, write-line, terpri и связанные с ними функции, например,

(let ((lines '("Hi," "Here is my entry" "Good bye")))
  (with-output-to-string (stream)
    (dolist (line lines)
      (write-line line stream)
      (terpri stream))))
=>
"Hi,

Here is my entry

Good bye

"
2 голосов
/ 12 февраля 2011

Несколько вещей о стиле кодирования

(defun print-formatted-text(txt)
  (let
      ((size   (array-total-size txt))
       (sorted (sort (sort txt #'compare-mix) #'compare-generic2))
       (result ""))
    (loop for i from 0 to (1- size) do
          (let ((el (aref sorted i)))

(LOOP FOR e1 ACROSS отсортировано

            (if (word? el)
                (setf result (concatenate 'string result (first el) " "))

повторное объединение строк действительно расточительно. Как отмечает Xach, STREAMS - лучшая абстракция.

              (if (null (nth 7 el))
                  nil
                (progn

использование: (when (nth 7 e1)

                  (setf result (concatenate 'string result " "))
                  (dolist (curr (nth 7 el))
                    (setf result (concatenate 'string result (first curr) " "))))))))
    result))
1 голос
/ 27 ноября 2018

Вы можете попробовать это

(format nil "~%")

например

(setf result (concatenate 'string result (format nil "~%")))
1 голос
/ 28 сентября 2017

Если вы используете конкатенацию для символов или новой строки, то вам нужно заключить в скобки такой список, как этот '(#\Newline).

где # \ Newline - символ новой строки.

Все символы, такие как те, которые были извлечены из строки, например (elt "abc" 1), должны быть преобразованы в список, например (list (elt "abc" 1).

Например, код:

(concatenate 'string 
   "Hi ther" '(#\e) "." '(#\Newline) "How " (list #\a #\r #\e) " you!" )

=> "Hi there.
How are you!"
...