如果你想"1010"
翻譯成10
(或#b1010
,#o12
或#xa
)您實現string->number
(define (string->number str radix)
(let loop ((acc 0) (n (string->list str)))
(if (null? n)
acc
(loop (+ (* acc radix)
(let ((a (car n)))
(- (char->integer a)
(cond ((char<=? a #\9) 48) ; [#\0-#\9] => [0-9]
((char<? a #\a) 55) ; [#\A-#\Z] => [10-36]
(else 87))))) ; [#\a-#\z] => [10-36]
(cdr n)))))
(eqv? #xAAF (string->number "aAf" 16)) ; ==> #t
它首先處理最高數字,每處理一個新數字,它將累加值乘以基數並添加新的「ones」,直到沒有更多字符。如果輸入"1010"
和2的累計值從開始到結束爲0, 0*2+1, 1*2+0, 2*2+1, 5*2+0
,最終將確保從右到左0..N編號的數字變成Sum(vn*radic^n)
現在,如果你需要一個過程,只做基地2個,然後製作一個包裝:
(define (binstr->number n)
(string->number n 2))
(eqv? (binstr->number "1010") #b1010) ; ==> #t
(+ s 0)有點像s不是嗎? – stark