Common Lisp
Как и в Scheme, у чисел также нет основ в Common Lisp, только их представления.
Визуализация числа в базе с использованием write-to-string
:
(write-to-string 10 :base 2)
; ==> "1010"
Считывание числа, представленного в определенной базе, с использованием parse-integer
:
(parse-integer "1010" :radix 2)
; ==> 10
; ==> 4 (index where the parser terminated)
(parse-integer "1010.1" :radix 2)
; parse-integer: substring "1010.1" does not have integer syntax at position 4
(parse-integer "1010.1" :radix 2 :junk-allowed t)
; ==> 10
; ==> 4 (index where the parser terminated)
В качестве альтернативы вы можете использовать считыватель / принтер, однако чтение работает, только если следующий токен не может быть интерпретирован как число с плавающей запятой:
(let ((*print-base* 2))
(prin1-to-string 10))
; ==> "1010"
(let ((*read-base* 2))
(read-from-string "1010"))
; ==> 10
; ==> 5
;; *read-base* ignored when interpreted as float
(let ((*read-base* 2))
(read-from-string "1010.1"))
; ==> 1010.1
; ==> 6
Я предполагаю, что глобальный *print-base*
и *read-base*
равны десяти.read-from-string
не волнует, есть ли после номера мусор, поэтому он ведет себя как (parse-integer "1010" :radix 2 :junk-allowed t)
В качестве дополнительной информации о прочитанном базовом документе.Вы можете указать читателю литералы для оснований 2, 8 и 16 и произвольные, которые переопределяют динамическую настройку:
#b1010 ; ==> 10 (base 2)
#o1010 ; ==> 520 (base 8)
#x1010 ; ==> 4112 (base 16)
#3r1010 ; ==> 30 (base 3)
#36rToBeOrNotToBe ; ==> 140613689159812836698 (base 36)