当我从方案中的控制台读取用户输入时,如果我从该类型转换为我想要的东西,我需要使用的类型是什么?
例如 (string-> number" 20")将字符串转换为数字,关于读取的语法是什么?
例如
(define input(read)
(let ((r read))
(????->number r)))
答案 0 :(得分:3)
如果我们查看read
的Racket文档,我们会将其视为签名:(read [in]) → any
。
因此,在您的情况下,如果用户输入一个数字,它将返回一个数字。 但要明确检查它是否为数字,因为您无法确定用户是否会输入其他内容!
一个例子:
(define (read-number)
(let ((inpt (read)))
(if (number? inpt)
inpt
(begin (display "Please input a number!")
(newline)
(read-number)))))
编辑:如果你想测试输入的数字是否为零,你应该用条件替换if
- 语句。
(cond ((and (number? inpt)
(= inpt 0)) ; Works because of lazy evalutation
; User inputted 0
...)
((number? inpt)
; User inputted a number other then zero
...)
(else
; User did not entered a number!
(display "Please input a number!")
(newline)
(read-number)))
答案 1 :(得分:2)
read
不会返回任何特定类型的内容 - 它会读取Scheme对象的文本表示并返回这样的对象。
示例(用<-
表示的输入):
> (read)
<- 23
23
> (read)
<- "hello"
"hello"
> (read)
<- (1 2 3)
'(1 2 3)
> (number? (read))
<- 23
#t
> (number? (read))
<- "hello"
#f
> (define x (read))
<- 4
> x
4
> (number? x)
#t
> (eqv? x 4)
#t
> (+ x 1)
5
> (let ((y (read))) (* y 2))
<- 4
8
因此,如果您想要一个号码,并且用户输入一个号码,您就不需要做任何事情 您可能想检查输入实际上是否为数字,并在这种情况下要求新值。