Ошибка, поскольку список не может иметь значения строковых элементов:
Это не правда. Список может иметь как строки, так и символы в качестве элементов, без проблем. Вы получаете сообщение об ошибке, потому что вы используете car
в строке, а не в списке.
(car (list->string(list(car (string->list "ABC")))))
Хорошо, здесь вы звоните (string->list "ABC")
, который дает вам список, содержащий символы A, B и C. Теперь вы вызываете car
для этого и получаете символ A обратно. До здесь нет проблем.
Но затем вы вызываете list
для этого символа, получая список, содержащий только символ A, и затем используете list-string
, чтобы превратить это в строку "A"
. Это все еще совершенно законно. Но затем вы вызываете car
для строки "A"
, и это ошибка, потому что вы вызываете car
для строки, но car
принимает только список (ну, фактически, любую пару) в качестве аргумента.
Поскольку вы пытаетесь сравнить A с этим первым элементом ('A 'B 'C 'D)
, то есть 'A
, который является символом, вы, вероятно, хотите преобразовать строку "A"
в символ 'A
(или символ 'A
в строку "A"
). Для этого вы можете использовать функцию string->symbol
вместо car
.
Получив символ A
, вы можете легко удалить его из списка с помощью функции filter
:
(let ((a (string->symbol (list->string (list (car (string->list "ABC")))))))
(filter (lambda (x) (not (eq? x a))) '(A B C)))