如何用Scheme的number->string和string->list生成无前缀#\的数字列表?
解决Scheme中数字转无前缀#\的数字列表问题
这个问题太典型啦——你现在得到的是字符类型的元素(每个带#\前缀是Scheme里字符的标准表示方式),而不是你想要的数字类型列表。要搞定这个,只需要给每个字符做个简单的转换就行,下面给你两种靠谱的方法:
方法1:用char->digit函数(推荐)
Scheme里有个专门的char->digit函数,能直接把数字字符转换成对应的整数。修改你的代码如下:
(define input 1234) (define (digit-list input) (map char->digit (string->list (number->string input))))
调用(digit-list input)后,就能得到干净的数字列表:(1 2 3 4)。
这个函数的好处是直观,而且会自动处理非数字字符(比如遇到字母的话会返回#f),逻辑非常清晰。
方法2:通过字符ASCII值计算(兼容所有Scheme实现)
如果你的Scheme环境没有char->digit函数(有些轻量实现可能没包含这个工具函数),可以用字符的ASCII值手动计算:每个数字字符的ASCII值减去字符#\0的ASCII值,结果就是对应的数字。代码如下:
(define input 1234) (define (digit-list input) (map (lambda (c) (- (char->integer c) (char->integer #\0))) (string->list (number->string input))))
测试一下,(digit-list 9876)会返回(9 8 7 6),效果和方法1完全一致。
额外补充:处理负数的情况
如果你的输入可能包含负数,上面的方法会把负号#\-也当成字符处理。可以加个简单判断,把负号单独提出来:
(define (digit-list input) (let ((str (number->string input))) (if (char=? (string-ref str 0) #\-) (cons '- (map char->digit (string->list (substring str 1)))) (map char->digit (string->list str)))))
这样输入-567会得到(- 5 6 7),满足带负号的数字列表需求。
内容的提问来源于stack exchange,提问作者haxtar
相关产品推荐
相关产品推荐

