Search code examples
lispdecimalcommon-lispoctal

Convert decimal number to octal in Lisp


I'm trying to write a function in Common Lisp to convert a base 10 number into a base 8 number, represented as a list, recursively.

Here's what I have so far:

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

This function works fine when I input numbers < 8 and > -8, but the recursive case is giving me a lot of trouble. When I try 8 as an argument (which should return (1 0)), I get an error Undefined operator T in form (T).

Thanks in advance.


Solution

  • It seems you have forgotten to (defun t ...) or perhaps it's not the function t you meant to have in the cond? Perhaps it's t the truth value?

    The dual namespace nature of Common Lisp makes it possible for t to both be a function and the truth value. the difference is which context you use it and you clearly are trying to apply t as a function/macro.

    Here is the code edited for the truth value instead of the t function:

    (defun base8(n)
      (cond
        ((zerop (truncate n 8)) (cons n nil))
        (t (cons (mod n 8) (base8 (truncate n 8))))))
    
    (base8 8) ; ==> (0 1)