在LISP中排序char列表



是否有一种方法可以对仅按字母顺序(从" a"到" z")组成的字符列表,例如:(列表c m y y k)=>(列表a c k m y)?

我没有找到类似的东西,所以我认为这可以解决问题:

cl-prompt> (setq q (mapcar 'string '(c m a y k))) => ("C" "M" "A" "Y" "K")
cl-prompt> (sort q 'string<) => ("A" "C" "K" "M" "Y")

在这一点上,我已经卡住了,因为通过使用char转换器,输出将不是我想要的列表。示例:

char (string 'a) 0 => #A

,我将拥有一个列表:(# a# c# k# m# y),这不是我想要的结果。

(c m a y k)的情况下,您有一个符号列表。对于(#A #C #K #M #Y),您有一个字符列表。

如果要根据符号名称对符号列表进行排序,则可以执行(我假设列表绑定到下面的变量foo):

(setq foo (sort foo #'string< :key #'symbol-name))

请注意,:key #'symbol-name可以被认为是多余的,因为string<实际上在"字符串指定器"上运行,但是对于人类读者来说,您确实打算要根据符号名称对列表进行对列表进行排序,如果您这么说。明确。

一个人可以将字符转换为其ASCII编号,对数字进行排序并转换回字符。以下是球拍中的代码,一个LISP/方案衍生物:

(define l (list #c #m #a #y #k))
(map integer->char
     (sort (map char->integer l) <))

输出:

'(#a #c #k #m #y)

最新更新