Clojure For Comprehension示例 [英] Clojure For Comprehension example
问题描述
我使用 docjure ,它需要一个列映射其选择列函数。我想抓住所有的列,而不必手动指定。
如何生成以下作为一个延迟无限矢量序列[:A:B:C:D:E ...:AA:AB:AC ....:ZZ ...:XFD]?
您的问题归结为:如何将数字转换为以字母AZ
。这里有一种方法 - 这可能不是最简洁的方法,但使它更加优雅留给读者做练习: )。
假设数字0-25映射到A - Z,26映射到AA等。首先我们定义一个将整数转换为列关键字的函数 to-col
。您可以使用该函数生成无限序列。
(defn to-col [num]
n nums()]
(if(> n 25)
(let [r(mod n 26)]
cons(char(+ 65 r))s)))
(关键字(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 $ b $ 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
; B:BJ:BK:BL:BM: BN:BO:BP:BQ:BR:BS:BT:BU:BV:BW:BX:BY:BZ
:CA:CB: CJ:CK:CL:CM:CN:CO:CP:CQ:CR
;; CS:CT:CU:CV)
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]?
解决方案Your question boils down to: "How do I convert a number to a base-26 string with the alphabet A-Z?".
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 :).
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屋!