lisp中的字符串加法赋值

lisp中的字符串加法赋值,lisp,common-lisp,Lisp,Common Lisp,我有一个带条件的循环,根据这个循环,我决定是否应该向现有字符串中追加一些内容。 在Python中,它应该是这样的(这是伪代码,只是为了说明这一点): 输出:024 所以问题是:如何在lisp中对字符串(+=)执行加法赋值?字符串连接依赖于更通用的函数: (concatenate 'string "a" "b") => "ab" 由于有些人认为它过于冗长,因此可以找到实现较短版本的库: (ql:quickload :rutils) (import 'rutils:strcat) 然后:

我有一个带条件的循环,根据这个循环,我决定是否应该向现有字符串中追加一些内容。 在Python中,它应该是这样的(这是伪代码,只是为了说明这一点):

输出:
024


所以问题是:如何在lisp中对字符串(
+=
)执行加法赋值?

字符串连接依赖于更通用的函数:

(concatenate 'string "a" "b")
=> "ab"
由于有些人认为它过于冗长,因此可以找到实现较短版本的库:

(ql:quickload :rutils)
(import 'rutils:strcat)
然后:

(strcat "a" "b")
为了分配和增长字符串,需要对现有变量使用
SETF

(let ((string ""))
  (dotimes (i 5)
    (when (evenp i)
      (setf string (strcat string (princ-to-string i)))))
  string)
Lisp中一种更惯用的方法是避免字符串串联,而是在写入缓冲区的流中打印

(with-output-to-string (stream)
  ;; now, stream is bound to an output stream 
  ;; that writes into a string. The whole form 
  ;; returns that string.
  (loop
     for i from 0 below 5 by 2
     do (princ i stream)))
 => "024"
在上面的这里,
stream
只是用于命名流的符号,您可以使用任何其他符号,包括表示当前输出流的特殊变量
*标准输出*
。这样做将使封闭的代码将其标准输出重定向到字符串流

构建中间列表的另一种方法如下所示,
iota
是库中的一个小实用程序:

为了生成字符串,您还可以使用,它有一个可以遍历列表的指令:

(format nil "~{~a~}" '(0 2 4))
=> "024"

nil
流目的地表示字符串目的地,意思是
(格式nil…
返回字符串。每个指令以一个波浪号字符(
~
)开头,
~{
~}
包含一个迭代指令;在该块中,
~a
以“美观”的方式(不可读)打印值。

在另一个库中,您有
str:concat
:另请参见
(delete-if #'oddp (alexandria:iota 5))
=> (0 2 4)
(format nil "~{~a~}" '(0 2 4))
=> "024"