Common lisp 在公共lisp中将数字强制为列表

Common lisp 在公共lisp中将数字强制为列表,common-lisp,Common Lisp,我想把整数变成列表。例如,2245=>(2 4 5) 我不喜欢(强制(写入字符串2245),因为它会产生(#\2#\2#\4#\5) 请帮忙?我实际上不使用common lisp,但我会在Scheme中这样做。希望这能有所帮助 (define (number-to-list x) (define (mod-cons x l) (if (zero? x) l (mod-cons (quotient x 10) (cons (remainder x

我想把整数变成列表。例如,2245=>(2 4 5)

我不喜欢
(强制(写入字符串2245)
,因为它会产生
(#\2#\2#\4#\5)


请帮忙?

我实际上不使用common lisp,但我会在Scheme中这样做。希望这能有所帮助

(define (number-to-list x)
  (define (mod-cons x l)
     (if (zero? x)
         l
         (mod-cons (quotient x 10) (cons (remainder x 10) l))))
  (mod-cons x '()))

 (number-to-list 1234)

与jon_darkstar相同,但有共同的lisp。这对于负数来说是失败的,但要修改却微不足道

(defun number-to-list (number)
  (assert (and (integerp number)
               (>= number 0)))
  (labels ((number-to-list/recursive (number) (print number)
             (cond
               ((zerop number)
                nil)
               (t
                (cons (mod number 10) 
                      (number-to-list/recursive (truncate (/ number 10))))))))
    (nreverse (number-to-list/recursive number))))

工作正常。

非负整数的通用Lisp实现:

(defun number-to-list (n &optional tail)
  (if (zerop n)
    (or tail '(0))
    (multiple-value-bind (val rem)
                         (floor n 10)
      (number-to-list val (cons rem tail)))))

另一种基于循环的解决方案。

我认为这有语法错误。当我把它移植到clisp行话时,它似乎也不起作用。我只是将常规除法改为商(整数除法)。刚刚在解释器中测试过,我不熟悉clisp,但是除了函数定义、整数除法、mod和cons之外,我什么都不用。我必须想象clisp拥有所有这些。也许用
(=x0)
代替
(zero?x)
?没有想到否定。什么是理想的行为?每个列表元素都是负数?就第一个?我想这取决于你对列表所代表的内容的理解。e、 (11)是11=1*10^1+1(-11)将是-1*10^1+1=-9。肯定有人可以使用
(循环…
)发布实现??有人否决了所有使用除法和mod的“数学”答案。想解释一下你为什么不喜欢它们吗?不,它不喜欢:(映射列表#数字字符-p(prin1到字符串-2455))给出(NIL 2 4 5 5)修改:
(映射列表(lambda(c)(或(数字字符-p c)-)(prin1到字符串n))
(defun number-to-list (n &optional tail)
  (if (zerop n)
    (or tail '(0))
    (multiple-value-bind (val rem)
                         (floor n 10)
      (number-to-list val (cons rem tail)))))
(defun number-to-list (n)    
  (loop for c across (write-to-string n) collect (digit-char-p c)))