Как сформулирован ваш вопрос не имеет смысла. Не существует такого понятия, как «шестнадцатеричное число»; «шестнадцатеричный» - это название системы представления чисел. В вашем примере ввод выглядит как символ, как говорит Райнер, но не каждый такой «шестнадцатеричный» символ. Предположительно, вы хотите, чтобы вывод (foo 10) был # x10, а здесь вводом является число. Так что, если ввод интерпретируется читателем Lisp как число (base-10), то его следует преобразовать в число, которое вы получите, если перечитаете основание 16.
Еще один момент, который не заметил Райнер, заключается в том, что если 0D понимается как символ, то (foo 0D) приведет к ошибке UNBOUND-VARIABLE. Вы должны написать (foo '0D), чтобы сделать 0D входом для foo.
Что касается вывода, я не думаю, что есть какой-либо нативный объект Lisp, который печатается как "#x ...". Если вы хотите, чтобы числа печатались в базе 16, тогда вы привязываете print-base к 16, но перед ним не будет никакого sharpsign-x.
Это предполагает несколько иной подход к вашей проблеме. Мы определяем новый тип данных, который печатает , начиная с #x, и заставляем foo создать такой объект:
(defstruct (pseudo-hex (:print-object pseudo-hex-print))
thing)
(defun pseudo-hex-print (h srm)
(format srm "#x~a" (pseudo-hex-thing h)))
(defun foo (x)
(make-pseudo-hex :thing x))
Теперь мы получаем следующее:
cl-user(162): (foo 38)
#x38
cl-user(163): (foo '0D)
#x0D
У меня странное чувство, что это не то, о чем спрашивал Рафаэль!