Из руководства SBCL :
On non-Unicode builds, the default external format is :latin-1.
Вы хотите использовать UTF-8.Так что делайте то, что говорится в руководстве, и настройте свою среду, когда вы вызываете SBCL:
$ LANG=C.UTF-8 sbcl --noinform --no-userinit --eval "(print (map 'string #'code-char (list 97 98 246)))" --quit
"abö"
$ LANG=C sbcl --noinform --no-userinit --eval "(print (map 'string #'code-char (list 97 98 246)))" --quit
"ab?"
Если вы используете SLIME или Sly из Emacs, есть способ настроить его в вашем init:
(setq sly-lisp-implementations
'((sbcl ("/opt/sbcl/bin/sbcl") :coding-system utf-8-unix)))
Затем используйте функцию проверки нормального состояния, например char=
.Вы должны использовать наиболее конкретный предикат всякий раз, когда это возможно, по моему мнению.char-equal
является регистронезависимой версией.
Хитрое руководство, хотя приведенный выше фрагмент работает и на SLIME, как slime-lisp-implemetations
Как отмечено в комментарии @Мануэль, если ваша переменная LANG и друзья не используют UTF-8, то вы обречены. Посмотреть этот вопрос