16

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

('a' to 'z')

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

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

或者

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

在我看来,这很冗长。有没有更好的方法来做到这一点?

4

4 回答 4

36

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

只需执行以下操作,您的代码就会更具可读性:

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

(char-range \a \f)
=> (\a \b \c \d \e \f)
于 2012-07-28T05:20:42.230 回答
17

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

(map char (range 97 123))

于 2012-07-26T14:10:15.663 回答
9

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
于 2012-07-26T14:11:01.233 回答
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)

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

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

djy:Clojure 的字符实用函数库

于 2018-05-07T11:13:51.280 回答