在Emacs Lisp中是否有与之相反的函数,即将split-string
列表的元素连接到由给定分隔符分隔的字符串中?换句话说,是否存在给定列表的函数,例如("foo" "bar" "baz")
,和分隔符,例如", "
,将该列表作为由该分隔符分隔的字符串返回,例如"foo, bar, baz"
.
Common Lisp似乎有这样的功能,但Emacs Lisp中具有相同名称的函数format
是一个完全不同的函数.
我希望用format
函数打印制表符.我可以实现这一点,~C
然后#\tab
作为格式的参数放置,但这似乎有点冗长,因为新行可以简单地~%
在字符串中放置一个.
format
功能打印标签最常用的做法是什么?感谢您的帮助!
如何~%
在列表中的每三个参数后添加回车符(使用)?
我现在有:
(format nil "~{~a ~}" (list '"one" '"two" '"three" '"four" '"five" '"six" '"seven" '"eight" '"nine" '"ten"))
;=> "one two three four five six seven eight nine ten "
Run Code Online (Sandbox Code Playgroud)
但我想:
;=> "one two three
; four five six
; seven eight nine
; ten "
Run Code Online (Sandbox Code Playgroud) 在Edi Weitz的cl cookbook中,对于pythonic join
,建议使用此功能:
(defun join (separator list)
(with-output-to-string (out)
(loop for (element . more) on list
do (princ element out)
when more
do (princ separator out))))
Run Code Online (Sandbox Code Playgroud)
然而,不知何故,我在思考,必须有一种方式以join
另一种方式表达,也许使用format
的能力......
在Seibel的书中,(在章节中format
)我们发现将列表中的字符串连接到带有分隔符的单个字符串
", "
:
(defvar l '("a" "b" "c"))
(format nil "~{~A~^, ~}" l)
;; "a, b, c"
Run Code Online (Sandbox Code Playgroud)
这是一个pythonic连接,非常简洁; 该~^
指令使得", "
只添加到最后一个元素之前,并且在没有元素跟随时添加.
但是,这里,分隔符字符串", "
是format指令的一部分.
一个棘手的案例是例如(defvar sep #\Tab)
.如果sep的表示"#\Tab"
可以在此格式指令中作为分隔符放置,从而导致:
(format nil "~{~A~^#\Tab~}" l)
Run Code Online (Sandbox Code Playgroud)
我们会达到目标.
显然,必须使用宏来生成格式指令...我尝试了类似的东西,(princ-to-string sep)
但这给了 …
我想将s-表达式转换为带有前缀符号的字符串format
。如何使用来完成format
?
例;
(format t "<insert format controls here>" (1 2 3) '*)
=> "1 * 2 * 3"
Run Code Online (Sandbox Code Playgroud) 假设您有一个列表列表,例如'(("abc" "def" "ghi") ("012" "345" "678") ("jkl" "mno" "pqr"))
或'(("ab" "cd" "ef") ("01" "23" "45"))
.
压缩给定列表中列表的规范方法是什么?即如何func
定义如此
(func '(("ab" "cd" "ef") ("01" "23" "45")) :sep "|" :combiner #'concat)
;; => ("ab|01" "cd|23" "ef|45")
(func '(("abc" "def" "ghi") ("012" "345" "678") ("jkl" "mno" "pqr")) ...)
;; => ("abc|012|jkl" "def|345|mno" "ghi|678|pqr")
Run Code Online (Sandbox Code Playgroud)
哪个concat := (lambda (args) ...)
是组合各个列表的头部的功能.
据推测,这种类型的操作被称为旋转或zipMany(根据不同语言的相关问题的答案).
我有类似的东西(双apply
)
(apply #'mapcar #'(lambda (&rest args) (apply #'concatenate 'string args)) lst) …
Run Code Online (Sandbox Code Playgroud)