在Lisp中将十进制数转换为八进制数

在Lisp中将十进制数转换为八进制数,lisp,decimal,common-lisp,octal,Lisp,Decimal,Common Lisp,Octal,我正在尝试用CommonLisp编写一个函数,以递归方式将以10为基数的数字转换为以列表表示的以8为基数的数字 以下是我目前掌握的情况: (defun base8(n) (cond ((zerop (truncate n 8)) (cons n nil)) ((t) (cons (mod n 8) (base8 (truncate n 8)))))) 当我输入数字-8时,这个函数工作得很好,但是递归的情况给我带来了很多麻烦。当我尝试将8作为参数(它应该返回(10))时,我得到一

我正在尝试用CommonLisp编写一个函数,以递归方式将以10为基数的数字转换为以列表表示的以8为基数的数字

以下是我目前掌握的情况:

(defun base8(n)
(cond
    ((zerop (truncate n 8)) (cons n nil))
    ((t) (cons (mod n 8) (base8 (truncate n 8))))))
当我输入数字<8和>-8时,这个函数工作得很好,但是递归的情况给我带来了很多麻烦。当我尝试将8作为参数(它应该返回
(10)
)时,我得到一个错误
未定义的运算符T,形式为(T)


提前谢谢。

您似乎忘记了
(defun t…
,或者这不是您想要的功能
t
?也许这是真值

Common Lisp的双重名称空间特性使得t既可以是函数也可以是真值。区别在于您使用它的上下文,并且您显然试图将
t
作为函数/宏应用

以下是为真值而不是
t
函数编辑的代码:

(defun base8(n)
  (cond
    ((zerop (truncate n 8)) (cons n nil))
    (t (cons (mod n 8) (base8 (truncate n 8))))))

(base8 8) ; ==> (0 1)

为了好玩,这里有一个不使用递归的解决方案,使用内置功能:

(defun base8 (n)
  (reverse (coerce (format nil "~8R" n) 'list)))

谢谢我的意思是
t
是真值。这修正了它,使它能像我期望的那样工作。现在我想得到我要返回的反向列表。是否可以只在一个函数中实现这一点,或者我必须有一个helper函数?不管怎样,我已经解决了:(defun base8(n)(cond((zerop(truncate n8))(cons n nil))(t(append(base8(truncate n8))(cons(mod n8))nil()()())))谢谢,但特别是为了这个练习,我不认为这是最有用的。对。这是纯粹的欢乐。