我正在尝试将十六进制数转换为十六进制数字。
例如在下面。
CL-USER> (foo 0D)
#x0D
我应该使用宏功能吗?
答案 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
我有一种有趣的感觉,这不是拉斐尔所要求的!