我想生成从'a'到'z'的字符序列。 在scala中,我可以非常简单地生成字符序列:
('a' to 'z')
但是在clojure中,我最终得到了以下代码:
(->> (range (int \a) (inc (int \z))) (map char))
或
(map char (range (int \a) (inc (int \z))))
在我看来很冗长。有没有更好的方法呢?
答案 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))
("" "" "" "" "" "" "" "")