Common lisp CommonLisp:如何对字符串的字符进行排序?

Common lisp CommonLisp:如何对字符串的字符进行排序?,common-lisp,Common Lisp,我知道如何在我所知道的其他语言中做到这一点,但我只是开始使用Lisp,还没有完全理解它。我的想法 列一个字符列表 转换为ascii值 分类 转换回字符 转换回字符串 似乎很严厉。有没有更好的办法?我试图写一个函数,给定一个字符串,返回一个字母排序的字符串。例如: gate => aegt house => ehosu door => door 此例程将用作字谜查找程序的一部分 谢谢 sort函数接受一个序列,该序列已经是一个字符串,因此您唯一的问题是找到正确的比较函数。字

我知道如何在我所知道的其他语言中做到这一点,但我只是开始使用Lisp,还没有完全理解它。我的想法

  • 列一个字符列表
  • 转换为ascii值
  • 分类
  • 转换回字符
  • 转换回字符串
似乎很严厉。有没有更好的办法?我试图写一个函数,给定一个字符串,返回一个字母排序的字符串。例如:

gate => aegt
house => ehosu
door => door
此例程将用作字谜查找程序的一部分


谢谢

sort函数接受一个序列,该序列已经是一个字符串,因此您唯一的问题是找到正确的比较函数。字符不是数字,因此您应该使用字符比较功能,例如
char>

* (sort (copy-seq "hello") #'char>)

"ollhe"

字符串是一个字符序列。对序列进行排序,使其对字符串进行排序,就像对列表进行排序一样:

(setq tester (copy-seq "lkjashd")) =>  "lkjashd"
(stable-sort tester #'char-lessp) =>  "adhjkls"
tester => "adhjkls" ; NB: it mutates the string!

在常见的Lisp中,字符串是序列,
sort
适用于任何序列类型,因此它可以实现这一点

下面是一个例子:

(let ((the-string (copy-seq "this is the string")))
  (sort the-string #'char-lessp))
;; => "   eghhiiinrsssttt"
以及用于
排序
稳定排序
的Hyperspec条目。只需选择谓词(sort的第二个参数)即可获得所需的排序顺序


请注意,我在示例中使用了
copy seq
,因为
sort
具有破坏性-它在适当的位置修改了字符串。

啊,谢谢!我知道字符串是序列,但不知道
#'char>
——太好了!顺便说一句,你的答案是正确的&首先,我选择了jbm,因为(a)他提供了更多的细节,这对我的案例很有帮助,(b)我想鼓励一个低代表性的海报,他给出了很好的答案(我想他在我选择它的时候是2xx)。所以:没有什么个人的,你的答案也很好!但是上面说“只能有一个。”;)很好的解释,谢谢。比起charThanks Olie,
#char-lessp
更受欢迎,我很高兴能帮上忙。区别在于
#'char-lessp
忽略大小写,而
#'charI认为复制文本字符串有点过分。。。您不可能通过就地更改它来影响任何其他内容,因为您刚刚在此处定义了它。@wvxvw常量折叠。。。我认为(尽管我必须仔细阅读CLH以确认)CL实现完全可以折叠
(let((a“foo”)(b“foo”)…)
(let(((#:temp“foo”)(let((a#:temp)(b#:temp))…)
在这种情况下,排序
a
会产生一个令人惊讶的副作用,排序
b
@wvxvw,LispWorks的文档明确地将字符串(通常是向量)标识为。在底部的示例中,他们建议不要在不使用
copy seq
的情况下对定义为文本的向量进行变异。