Преобразование десятичного числа в восьмеричное в Лиспе

Я пытаюсь написать функцию в 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).

Заранее спасибо.


person user2177693    schedule 04.11.2013    source источник


Ответы (2)


Кажется, вы забыли (defun t ...) или, возможно, это не та функция 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)
person Sylwester    schedule 04.11.2013
comment
Спасибо! Я имел в виду t как истинное значение. Это исправило его, поэтому он работает так, как я ожидаю. Теперь я хочу иметь обратный список, который я возвращаю. Можно ли сделать это только в одной функции, или у меня должна быть вспомогательная функция? - person user2177693; 04.11.2013
comment
Ничего, я понял это: (defun base8(n) (cond ((zerop (truncate n 8)) (cons n nil)) (t (append (base8 (truncate n 8)) (cons (mod n 8)) ноль))))) - person user2177693; 04.11.2013

Просто для удовольствия, вот решение без рекурсии, использующее встроенную функциональность:

(defun base8 (n)
  (reverse (coerce (format nil "~8R" n) 'list)))
person Lars Brinkhoff    schedule 07.11.2013
comment
Спасибо, но конкретно для упражнения, я не думаю, что это самое полезное. - person user2177693; 07.11.2013
comment
Верно. Это было исключительно для веселья. - person Lars Brinkhoff; 07.11.2013