Common Lisp Concatenate和换行符

Erh*_*mir 1 lisp sorting formatting common-lisp

我目前正在编写一个LISP程序,它以下列列表的形式分析CR结果:("I"0 10 0 20)<<(单词X0 X1 Y0 Y1)

它必须使用单词的位置来构建整个文本.我的代码有一个集群分析器,可以找到集群布局,例如左对齐或右对齐甚至两者的段落.群集数据结构如下所示:("群集名称"xline y0 y1'(群集词))

当我迭代字符串列表并将它们连接到结果字符串以从这些字符串创建格式化文本时,如何添加新行?例:

"Hi,\n
\n
here is my entry\n
\n
Good bye"
Run Code Online (Sandbox Code Playgroud)

我的代码如下:

(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))
Run Code Online (Sandbox Code Playgroud)

如果当前数据不是单词,那么它是一个段落.这意味着,我需要先添加一个新行,然后再将段落的内容输出.

这里连接的用法是否正确?

谢谢你的建议.

Xac*_*ach 6

我不能完全按照你的计划,但它与字符串流和使用的工作更容易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

"
Run Code Online (Sandbox Code Playgroud)