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

nta*_*lbs 12 character clojure sequence

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

('a' to 'z')
Run Code Online (Sandbox Code Playgroud)

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

(->> (range (int \a) (inc (int \z))) (map char))
Run Code Online (Sandbox Code Playgroud)

要么

(map char (range (int \a) (inc (int \z))))
Run Code Online (Sandbox Code Playgroud)

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

mik*_*era 31

如果代码看起来"冗长",那么通常只是表明你应该将它分解为一个单独的函数.作为奖励,您有机会为该功能提供有意义的名称.

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

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

(char-range \a \f)
=> (\a \b \c \d \e \f)
Run Code Online (Sandbox Code Playgroud)


Sys*_*hus 14

根据这个StackOverflow答案,一个简单的解决方案是:

(map char (range 97 123))

  • 看起来很简单,但是,我想避免像97,123等魔术数字. (4认同)
  • 像`(map char(range(int\a)(int\z)))`这样简单的东西可以避免幻数. (3认同)

xia*_*owl 5

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

(flatten (partition 1 "abcdefghijklmnopqrstuvwxyz"))
Run Code Online (Sandbox Code Playgroud)

编辑

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

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

  • @xiaowl:不需要使用flatten&partition ...尝试:(seq"abcdefghijklmnopqrstuvwxyz") (4认同)
  • 好吧,如果我键入字符"abc ... z",我不需要生成它. (3认同)
  • ;)虽然你需要26型字符,但这种方式很清楚.如果你不喜欢,`(地图char(范围......`是唯一的方法,我认为.无论如何,Scala确实适合你,但是clojure没有,所以...... (2认同)