Clojure For Comprehension示例

Kob*_*son 5 clojure sequence for-comprehension

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

Ger*_*ert 6

您的问题归结为:" 如何将数字转换为带字母AZ的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))))))
Run Code Online (Sandbox Code Playgroud)

这为您提供了一种生成无限列关键字的方法:

(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)
Run Code Online (Sandbox Code Playgroud)