从'生成字符序列;a';至';z';在clojure

从'生成字符序列;a';至';z';在clojure,clojure,character,sequence,Clojure,Character,Sequence,我想生成从“a”到“z”的字符序列。 在scala中,我可以非常简单地生成字符序列: ('a' to 'z') 但在clojure中,我最终得到了以下代码: (->> (range (int \a) (inc (int \z))) (map char)) 或 在我看来,这是冗长的。有更好的方法吗?根据一个简单的解决方案: (mapchar(范围97 123))AFAIK,没有Scala这样奇特的方式。怎么样 (flatten (partition 1 "abcdefghijklm

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

('a' to 'z')
但在clojure中,我最终得到了以下代码:

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

在我看来,这是冗长的。有更好的方法吗?

根据一个简单的解决方案:


(mapchar(范围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
如果代码看起来“冗长”,这通常只是一个迹象,表明您应该将其分解为单独的函数。作为奖励,您有机会为函数指定一个有意义的名称

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

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

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

如果您对提供方便的
char range
函数的库感兴趣,我的库
djy
有一个:请参阅

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

boot.user=>(字符范围(char'0x1f910)(char'0x1f917))

(“好吧,如果我键入字符“abc…z”,我不需要生成它。;)虽然您需要键入26个字符,但这种方式非常容易理解。如果您不喜欢,
(映射字符(范围…
是唯一的方法,我想。不管怎样,Scala确实适合你,但clojure不适合,所以..是的,你是对的。我同意你的代码很清晰易懂。谢谢你的回答和评论。我想知道的是,我写的代码是最好的方法,或者有其他任何新奇的方法来完成这项工作。@xiaowl:不需要我们e展平和分区…试试:(seq“abcdefghijklmnopqrstuvwxyz”)@rhu比(展平(分区…)简单得多。谢谢。看起来很简单,但是,我想避免像97、123之类的幻数。像
(map char(range(int\a)(int\z))
这样简单的东西可以避免幻数。只需稍加修改:
(map char(range)(range))(int\a)(inc(int\z))
您的方法很好,如果您关心详细性,只需将其包装在一个函数中:(defn to[start end](>>(range(int-start))…),然后(to'a''z')就可以工作了。您可以通过去掉这里的
->
宏来稍微减少详细性,因为这似乎是不必要的:
(map char(range))(int\a)(int\z))
。此外,我同意@user593508的观点,即您可以很容易地自己编写一个函数来完成您想要的任务。
(defn char range[start char end char](map char(range(int start char)(int end char)))
。然后
(char range\a\z)
应该可以工作,就像
(char range\b\n)一样
等@OmriBernstein我同意。事实上,我认为代码(映射字符(范围…),然后我改为使用->>宏以提高可读性。这似乎是个人喜好。@Omni让这个问题有趣的是
(字符范围\a\z)
停在
\y
(inc\z)
无效,如果
char range
正在执行
inc
操作,则与
range
不一致。我能看到的唯一“好”选项是另一个助手函数
(defn next char[ch](>ch int inc char))
(defn char-range [start end]
  (map char (range (int start) (inc (int end)))))

(char-range \a \f)
=> (\a \b \c \d \e \f)
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)