方案:读取什么类型?

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

所以如果你想要一个数字,而用户输入了一个数字,你不需要做任何事情。
不过,您可能想要检查输入实际上是一个数字,并在这种情况下要求一个新值。