方案:读什么类型?

时间:2015-09-30 05:36:34

标签: syntax types functional-programming scheme

当我从方案中的控制台读取用户输入时,如果我从该类型转换为我想要的东西,我需要使用的类型是什么?

例如 (string-> number" 20")将字符串转换为数字,关于读取的语法是什么?

例如

(define input(read)
    (let ((r read))
    (????->number r)))

2 个答案:

答案 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

因此,如果您想要一个号码,并且用户输入一个号码,您就不需要做任何事情 您可能想检查输入实际上是否为数字,并在这种情况下要求新值。