我知道如何用我知道的所有其他语言做到这一点,但我刚刚开始使用 Lisp 并不太了解它。我的想法
- 制作一个字符列表
- 转换为 ascii 值
- 种类
- 转换回字符
- 转换回字符串
显得手重脚轻。有没有更好的方法来做到这一点?我正在尝试编写一个函数,给定一个字符串,返回一个按字母排序的字符串。因此,例如:
gate => aegt
house => ehosu
door => door
此例程将用作字谜查找器的一部分。
谢谢!
我知道如何用我知道的所有其他语言做到这一点,但我刚刚开始使用 Lisp 并不太了解它。我的想法
显得手重脚轻。有没有更好的方法来做到这一点?我正在尝试编写一个函数,给定一个字符串,返回一个按字母排序的字符串。因此,例如:
gate => aegt
house => ehosu
door => door
此例程将用作字谜查找器的一部分。
谢谢!
在 Common Lisp 中,字符串是序列,并且sort
适用于任何序列类型,所以它可以解决问题。
这是一个例子:
(let ((the-string (copy-seq "this is the string")))
(sort the-string #'char-lessp))
;; => " eghhiiinrsssttt"
这是sort
和的 Hyperspec 条目stable-sort
。只需选择您的谓词( 的第二个参数sort
)即可获得所需的排序顺序。
请注意,我copy-seq
在示例中使用是因为sort
具有破坏性 - 它就地修改了字符串。
该sort
函数采用一个序列,该序列已经是一个字符串,因此您唯一的问题是找到正确的比较函数。字符不是数字,所以你应该使用字符比较函数,例如char>
:
* (sort (copy-seq "hello") #'char>)
"ollhe"
字符串是一个字符序列。sort 对序列进行排序,因此它对字符串进行排序,就像对列表进行排序一样:
(setq tester (copy-seq "lkjashd")) => "lkjashd"
(stable-sort tester #'char-lessp) => "adhjkls"
tester => "adhjkls" ; NB: it mutates the string!