我想从STDIN获取两个数字并将它们的总和打印到STDOUT。以下代码是我的解决方案:
#lang racket
(displayln (+ (string->number (string-trim (read-line)))
(string->number (string-trim (read-line)))))
如果输入是
1
2
有时输出为3
,但有时输出为:
+: contract violation
expected: number?
given: #f
argument position: 1st
other arguments...:
2
context...:
sum.rkt: [running body]
为什么?
如下图所示:
我编写了以下代码来探索我的程序的行为:
#lang racket
(displayln "Input:")
(define s1 (string-trim (read-line)))
(define s2 (string-trim (read-line)))
(displayln "Output:")
(displayln (string->list s1))
(displayln (string->list s2))
(define n1 (string->number (string-trim s1)))
(define n2 (string->number (string-trim s2)))
(displayln n1)
(displayln n2)
(displayln (+ n1 n2))
我的电脑很慢,所以Input:
行需要一段时间才能出来。如果我在输入输入之前等到行显示,程序将按照我的预期运行:
但如果我不等待Input:
行并直接输入我的输入,有时会发生错误:
所以现在我的问题是:
R
是什么意思?1
,但第二个输入错误地解释为R
?(我在v6.1.1
下运行了球拍Winodws 7 Pro SP1
答案 0 :(得分:0)
最好使用(read)
来读取数字,假设您可以依赖于合理的输入(即,如果它实际上是数字而不是垃圾,或者更糟糕的是,大量的S表达式)。因此,您的代码将是:
(displayln (+ (read) (read)))