在clojure中生成从'a'到'z'的字符序列

时间:2012-07-26 13:59:20

标签: clojure character sequence

我想生成从'a'到'z'的字符序列。 在scala中,我可以非常简单地生成字符序列:

('a' to 'z')

但是在clojure中,我最终得到了以下代码:

(->> (range (int \a) (inc (int \z))) (map char))

(map char (range (int \a) (inc (int \z))))

在我看来很冗长。有没有更好的方法呢?

4 个答案:

答案 0 :(得分:31)

如果代码看起来“冗长”,那么通常只是表明您应该将其分解为单独的函数。作为奖励,你有机会给这个函数一个有意义的名字。

只需做这样的事情,你的代码就会更具可读性:

(defn char-range [start end]
  (map char (range (int start) (inc (int end)))))

(char-range \a \f)
=> (\a \b \c \d \e \f)

答案 1 :(得分:13)

根据this StackOverflow Answer,一个简单的解决方案是:

(map char (range 97 123))

答案 2 :(得分:5)

AFAIK,没有像Scala那样奇特的方式。 <怎么样

(flatten (partition 1 "abcdefghijklmnopqrstuvwxyz"))

修改

更加花哨的方式,感谢@rhu

(seq "abcdefghijklmnopqrstuvwxyz") ; if you copied this from an earlier version, \w and \v were in the wrong positions

答案 3 :(得分:3)

如果您对提供方便的char-range功能的图书馆感兴趣,我的图书馆djy就有一个:请参阅djy.char/char-range

boot.user=> (char-range \a \z)
(\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)

它甚至处理足够大的补充Unicode字符,它们需要2个字符,将它们表示为字符串:

boot.user=> (char-range (char' 0x1f910) (char' 0x1f917))
("" "" "" "" "" "" "" "")

djy: a library of character utility functions for Clojure