Преобразование шестнадцатеричного числа в представление шестнадцатеричного числа в общем lisp - PullRequest
1 голос
/ 01 июля 2010

Я пытаюсь преобразовать шестнадцатеричное число в представление шестнадцатеричного числа.

, например, ниже.

CL-USER> (foo 0D)
#x0D

Должен ли я использовать макро функцию?

Ответы [ 3 ]

3 голосов
/ 01 июля 2010

0D является символом (по умолчанию). Получите его имя с SYMBOL-NAME в виде строки. Используйте PARSE-INTEGER с: RADIX 16, чтобы получить номер.

Если у вас нет причин для этого, представлять шестнадцатеричные числа в виде символов я бы не стал.

0 голосов
/ 26 ноября 2010

Как сформулирован ваш вопрос не имеет смысла. Не существует такого понятия, как «шестнадцатеричное число»; «шестнадцатеричный» - это название системы представления чисел. В вашем примере ввод выглядит как символ, как говорит Райнер, но не каждый такой «шестнадцатеричный» символ. Предположительно, вы хотите, чтобы вывод (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

У меня странное чувство, что это не то, о чем спрашивал Рафаэль!

0 голосов
/ 01 июля 2010

Вы говорите, что хотите отформатировать число в виде шестнадцатеричной строки? Если это так, вы хотели бы что-то вроде этого: (format nil "~x" #x0D)

...