我想生成从“a”到“z”的字符序列。在 scala 中,我可以非常简单地生成字符序列:
('a' to 'z')
但是在clojure中,我最终得到以下代码:
(->> (range (int \a) (inc (int \z))) (map char))
或者
(map char (range (int \a) (inc (int \z))))
在我看来,这很冗长。有没有更好的方法来做到这一点?
如果代码看起来“冗长”,通常只是表明您应该将其分解为单独的函数。作为奖励,您有机会给函数起一个有意义的名称。
只需执行以下操作,您的代码就会更具可读性:
(defn char-range [start end]
(map char (range (int start) (inc (int end)))))
(char-range \a \f)
=> (\a \b \c \d \e \f)
根据this StackOverflow Answer,一个简单的解决方案是:
(map char (range 97 123))
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
如果您对提供方便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)
它甚至可以处理足够大以至于需要 2 个字符的补充 Unicode 字符,将它们表示为字符串:
boot.user=> (char-range (char' 0x1f910) (char' 0x1f917))
("" "" "" "" "" "" "" "")