Clojure 在字符串列表中每n个元素插入一个字符串

Clojure 在字符串列表中每n个元素插入一个字符串,clojure,lisp,Clojure,Lisp,我是新来Clojure的 我正在开发一个井字游戏 我正在尝试制作一个“格式化”电路板的函数,这是一个以位置编号为键的地图,关键字:x:o和:e表示值(:e代表空) 我想在关键字名称列表中每隔3个插入一个换行符 例如,应将“x”“x”“e”“e”“e”“e”“e”“e”“e”“e”“e”“e”转换为“x”“x”“x”“\n”“e”“e”“e”“e”“\n”“e”“e”“e”“,然后我将连接这些字符串以便打印它 (defn- newline-every [n list] (if (empt

我是新来Clojure的

我正在开发一个井字游戏

我正在尝试制作一个“格式化”电路板的函数,这是一个以位置编号为键的地图,关键字
:x
:o
:e
表示值(:e代表空)


我想在关键字名称列表中每隔3个插入一个换行符

例如,应将
“x”“x”“e”“e”“e”“e”“e”“e”“e”“e”“e”“e”
转换为
“x”“x”“x”“\n”“e”“e”“e”“e”“\n”“e”“e”“e”“
,然后我将连接这些字符串以便打印它

(defn- newline-every
  [n list]
  (if (empty? list)
    []
    (let [[fst snd] (split-at n list)]
      (concat
        (conj fst "\n")
        (newline-every n snd)))))

这是Clojure,所以在一行中肯定有很多方法可以做到这一点。这里有一个尝试:

(flatten (interpose "\n" (partition n list))))
正如用户amalloy所评论的,从来没有理由使用
展平
,所以这里有一个更好的方法:

(apply concat (interpose ["\n"] (partition n list))))
从您给出的字符串序列(所有字符串都包含一个字符)开始,它给出:

... > (newline-every 3 ["x" "x" "x" "e" "e" "e" "e" "e" "e"])
("x" "x" "x" "\n" "e" "e" "e" "\n" "e" "e" "e")
然后可以将其转换为字符串:

... > (apply str (newline-every 3 ["x" "x" "x" "e" "e" "e" "e" "e" "e"]))
"xxx\neee\neee"

你得到了什么错误?好吧,这是尴尬的,似乎REPL被窃听或什么的,但现在没有错误。但它给出了一个错误的输出。这还不错,但实际上从来没有理由使用
flatten
。相反,您可以编写类似于
(apply str(apply concat(interpose[“\n”](partition n list)))
的内容。这种解决方案的问题是,如果
列表的长度不是
n
的倍数,那么它就不能按预期工作。