上下文:我已经从互联网上解析了一些大量的XML数据。现在我想在REPL中探索/过滤/深入挖掘。
我有一个名为xs
的未知长度和内容的LazySeq。我想在REPL中探索xs
的前几个元素。为了方便,我想要这样def
一些变量:
(def x1 (nth xs 0 nil))
...
(def x5 (nth xs 4 nil))
这需要输入很多,尤其是当我需要重复进行,以开发我的“深入挖掘”函数时。有没有什么便利的函数(或宏)可以帮我做到这一点?也许像这样
(defmany xs "x" 5)
;=> #'my.ns/x1
;=> ...
;=> #'my.ns/x5
我尝试写了一个函数来做这个。它使用eval
不安全(还有其他缺点)。所以,我的问题是
- 这种东西存在吗?
- 我需要写一个宏吗?或者可以用一个函数完成这个任务?(我不熟悉编写Clojure宏)
- 如何定义这个函数/宏?
为了娱乐,这是我的尝试
(defn def-many
[xs prefix n]
(map eval
(for [i (range n)]
(list 'def
(symbol (str prefix (inc i)))
(nth xs i nil)))))
(如果(nth xs i nil)
是一个LazySeq或一个列表,那么eval
将尝试将其解释为一个函数调用。这可以进行测试,并转换为向量等。但这是不是很好。)