Clojure For Comprehension 示例

标签 clojure sequence for-comprehension

我正在使用 docjure并且它的 select-columns 函数需要一个列映射。我想获取所有列而无需手动指定。
如何将以下内容生成为惰性无限向量序列 [:A :B :C :D :E ... :AA :AB :AC .... :ZZ ... :XFD]?

最佳答案

您的问题归结为:“如何将数字转换为带有字母 A-Z 的 base-26 字符串?”。

这里有一种方法可以做到这一点 - 可能不是最简洁的方法,但让它更优雅留给读者作为练习:)。

假设数字 0-25 映射到“A”-“Z”,26 映射到“AA”,等等。首先我们定义一个函数 to-col将整数转换为列关键字。您可以使用该函数生成无限序列。

(defn to-col [num]
  (loop [n num s ()]
    (if (> n 25)
      (let [r (mod n 26)]
        (recur (dec (/ (- n r) 26)) (cons (char (+ 65 r)) s)))
      (keyword (apply str (cons (char (+ 65 n)) s))))))

这为您提供了一种生成无限列关键字序列的方法:
(take 100 (map to-col (range)))
;; => (:A :B :C :D :E :F :G :H :I :J :K :L :M :N :O :P :Q :R :S :T :U :V :W
;; :X :Y :Z :AA :AB :AC :AD :AE :AF :AG :AH :AI :AJ :AK :AL :AM :AN :AO :AP
;; :AQ :AR :AS :AT :AU :AV :AW :AX :AY :AZ :BA :BB :BC :BD :BE :BF :BG :BH
;; :BI :BJ :BK :BL :BM :BN :BO :BP :BQ :BR :BS :BT :BU :BV :BW :BX :BY :BZ
;; :CA :CB :CC :CD :CE :CF :CG :CH :CI :CJ :CK :CL :CM :CN :CO :CP :CQ :CR
;; :CS :CT :CU :CV)

关于Clojure For Comprehension 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11530574/

相关文章:

clojure - 如何将导入添加到 "eval"ed 的 clojure 代码中?

docker - Clojure热装

clojure - 如何在 Clojure 中创建本地类型?

oracle - Oracle触发器的HIbernate问题,用于从序列中生成ID

python - 对有限集中的符号列表进行编码的最紧凑方法是什么?

python - 检测数字序列中的重复循环(python)

intellij-idea - 如何使用 Clojure REPL (La Clojure) 加载具有依赖项的单个 clojure 文件?

scala - 在 for 理解中将选项与列表组合会导致类型不匹配,具体取决于顺序

scala - 两个列表的笛卡尔积