我想转换("USERID=XYZ" "USERPWD=123")为"USERID=XYZ&USERPWD=123".我试过了
(apply #'concatenate 'string '("USERID=XYZ" "USERPWD=123"))
Run Code Online (Sandbox Code Playgroud)
将返回""USERID=XYZUSERPWD=123".
但我不知道如何插入'&'?以下功能有效但似乎有点复杂.
(defun join (list &optional (delim "&"))
(with-output-to-string (s)
(when list
(format s "~A" (first list))
(dolist (element (rest list))
(format s "~A~A" delim element)))))
Run Code Online (Sandbox Code Playgroud) 如果我有一个包含任意数量列表的列表,如下所示:
var myList = new List<List<string>>()
{
new List<string>() { "a", "b", "c", "d" },
new List<string>() { "1", "2", "3", "4" },
new List<string>() { "w", "x", "y", "z" },
// ...etc...
};
Run Code Online (Sandbox Code Playgroud)
...有没有办法以某种方式将列表"压缩"或"旋转"成这样的东西?
{
{ "a", "1", "w", ... },
{ "b", "2", "x", ... },
{ "c", "3", "y", ... },
{ "d", "4", "z", ... }
}
Run Code Online (Sandbox Code Playgroud)
显而易见的解决方案是做这样的事情:
public static IEnumerable<IEnumerable<T>> Rotate<T>(this IEnumerable<IEnumerable<T>> list)
{
for (int i = 0; i < list.Min(x => x.Count()); i++) …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)但这给了 …