方案:读取什么类型?
Scheme: What type is read?
当我从 scheme 中的控制台读取用户输入时,如果我要从该类型转换为我想要的类型,我需要使用什么类型?
例如
(string->number "20") 将字符串转换为数字,关于读取的语法是什么?
例如
(define input(read)
(let ((r read))
(????->number r)))
如果我们查看 read
的 Racket 文档,我们会看到签名:(read [in]) → any
.
因此在您的情况下,如果用户输入一个数字,它将 return 一个数字。
但是明确检查它是一个数字,因为你不能确定用户不会输入其他东西!
一个例子:
(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)))
read
不 return 任何特定类型的东西——它读取 Scheme 对象的文本表示和 return 这样的对象。
示例(用<-
表示的输入):
> (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
所以如果你想要一个数字,而用户输入了一个数字,你不需要做任何事情。
不过,您可能想要检查输入实际上是一个数字,并在这种情况下要求一个新值。
当我从 scheme 中的控制台读取用户输入时,如果我要从该类型转换为我想要的类型,我需要使用什么类型?
例如 (string->number "20") 将字符串转换为数字,关于读取的语法是什么?
例如
(define input(read)
(let ((r read))
(????->number r)))
如果我们查看 read
的 Racket 文档,我们会看到签名:(read [in]) → any
.
因此在您的情况下,如果用户输入一个数字,它将 return 一个数字。 但是明确检查它是一个数字,因为你不能确定用户不会输入其他东西!
一个例子:
(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)))
read
不 return 任何特定类型的东西——它读取 Scheme 对象的文本表示和 return 这样的对象。
示例(用<-
表示的输入):
> (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
所以如果你想要一个数字,而用户输入了一个数字,你不需要做任何事情。
不过,您可能想要检查输入实际上是一个数字,并在这种情况下要求一个新值。