我有一个带有条件的循环,根据该循环,我决定是否应该向现有字符串添加内容.在Python中,它应该看起来像(这是虚拟代码,只是为了显示这个想法):
result_str = ''
for item in range(5):
if item % 2 == 0:
result_str += str(item)
print(result_str)
Run Code Online (Sandbox Code Playgroud)
输出: 024
所以问题是:如何+=
在lisp中对strings()执行添加赋值?
字符串连接依赖于更通用的CONCATENATE
功能:
(concatenate 'string "a" "b")
=> "ab"
Run Code Online (Sandbox Code Playgroud)
由于它被一些人认为是冗长的,你可以找到实现更短版本的库:
(ql:quickload :rutils)
(import 'rutils:strcat)
Run Code Online (Sandbox Code Playgroud)
然后:
(strcat "a" "b")
Run Code Online (Sandbox Code Playgroud)
要分配和增长字符串,您需要使用SETF
现有变量.
(let ((string ""))
(dotimes (i 5)
(when (evenp i)
(setf string (strcat string (princ-to-string i)))))
string)
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
上面stream
只是用于命名流的符号,您可以使用任何其他符号,包括*standard-output*
表示当前输出流的特殊变量.这样做会使封闭的代码将其标准输出重定向到字符串流.
构建中间列表的另一种方法如下,其中iota
是alexandria库中的一个小实用程序:
(delete-if #'oddp (alexandria:iota 5))
=> (0 2 4)
Run Code Online (Sandbox Code Playgroud)
为了生成一个字符串,你也可以使用FORMAT
,它有一个可以迭代列表的指令:
(format nil "~{~a~}" '(0 2 4))
=> "024"
Run Code Online (Sandbox Code Playgroud)
该nil
流的目的表示一个字符串的目标,这意味着(format nil ...)
返回一个字符串.每个指令都以波形符(~
)开头,~{
并~}
包含一个迭代指令; 在该块内,~a
打印"美学"(不可读)的值.
归档时间: |
|
查看次数: |
136 次 |
最近记录: |