Clojure For Comprehension 示例 [英] Clojure For Comprehension example

查看:15
本文介绍了Clojure For Comprehension 示例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using docjure and it needs a column map for its select-columns function. I would like to grab all my columns without having to specify it manually. How do I generate the following as a lazy infinite vector sequence [:A :B :C :D :E ... :AA :AB :AC .... :ZZ ... :XFD]?

推荐答案

您的问题归结为:如何将数字转换为带有字母 AZ 的 base-26 字符串?".

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

Here's one way to do that - probably not the most concise way, but making it more elegant is left as an exercise for the reader :).

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

Assume that numbers 0-25 map to 'A'-'Z', 26 maps to 'AA', etcetera. First we define a function to-col that converts an integer to a column keyword. You can use that function to generate an infinite sequence.

(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))))))

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

That gives you a way to generate an infinite sequence of column keywords:

(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 示例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆