将十六进制数转换为通用lisp中的十六进制数表示

时间:2010-07-01 04:02:28

标签: format common-lisp numbers

我正在尝试将十六进制数转换为十六进制数字。

例如在下面。

CL-USER> (foo 0D)
#x0D

我应该使用宏功能吗?

3 个答案:

答案 0 :(得分:3)

0D是一个符号(默认情况下)。使用SYMBOL-NAME作为字符串获取其名称。使用PARSE-INTEGER:RADIX 16获取数字。

如果你没有任何理由,将十六进制数字表示为符号是我不会做的。

答案 1 :(得分:0)

您是说要将数字格式化为十六进制字符串?如果是这样,你会想要这样的东西:(format nil "~x" #x0D)

答案 2 :(得分:0)

如上所述,你的问题毫无意义。没有“十六进制数”这样的东西; “十六进制”是数字表示系统的名称。在你的例子中,输入似乎是一个符号,正如Rainer所说,但不是每个这样的“十六进制”都是符号。大概你想要(foo 10)的输出是#x10,这里输入是一个数字。因此,如果输入被Lisp阅读器解释为(基数为10)的数字,则应将其转换为重读基数16时的数字。

Rainer忽略的另一点是,如果将0D理解为符号,则(foo 0D)将导致UNBOUND-VARIABLE错误。你必须写(foo'0D)才能使0D成为foo的输入。

在输出端,我认为没有任何本机Lisp对象打印为“#x ...”。如果你想在16号基础上打印数字,那么你将 print-base 绑定到16,但你不会在它前面看到任何锐利-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

我有一种有趣的感觉,这不是拉斐尔所要求的!