Common lisp 在公共lisp中将数字强制为列表
我想把整数变成列表。例如,2245=>(2 4 5) 我不喜欢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#\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)))