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

时间:2013-11-04 17:38:01

标签: lisp decimal common-lisp octal

我正在尝试在Common Lisp中编写一个函数,将基数为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作为参数(应返回(1 0))时,我收到错误Undefined operator T in form (T)

提前致谢。

2 个答案:

答案 0 :(得分:1)

您似乎忘记了(defun t ...)或者可能不是您想要在cond中使用的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)

答案 1 :(得分:1)

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

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