2016-12-17 14 views
0

Я пытаюсь написать какую-либо функцию для сортировки этого типа списка:Сортировка списка списков в Common Lisp

((1 A) (2 E) (4 D))

Я нашел встроенную функцию рода в Common Lisp, но я могу Я делаю то, что хочу.
Это должно быть результатом:

'((1 A) (4 D) (2 E)) 

Я хочу, чтобы отсортировать список по второму элементу каждого списка, в алфавитном порядке.

Это то, что я сделал:

(sort '((1 A) (4 D) (2 E)) #'char-lessp :key #'second) 

Во всяком случае, я бы понял, как сортировать список с конкретной функции, используя: ключ».

спасибо.

ответ

2

Вы должны использовать:

(sort '((1 A) (4 E) (2 D)) #'string<= :key #'second) 

Причина заключается в том, что char-lessp сравнивает символы, и A, E и D не символы, а символы. Функция string< может использоваться для сравнения их имен, которые представляют собой строки "A", "E" и "D". Например:

CL-USER> (string= 'symbol "SYMBOL") 
T 
CL-USER> (symbol-name 'symbol) 
"SYMBOL" 

Обратите внимание, что операторы сравнения на строках есть две версии, для случая чувствительных и нечувствительны к регистру сравнения:

CL-USER> (string= "a" "A") 
NIL 
CL-USER> (string-equal "a" "A") 
T 
CL-USER> (string= 'a "a") 
NIL 
CL-USER> (string-equal 'a "a") 
T