我是品牌打屁股的新计划。在某种程度上,今晚是我第一次玩它,除了幻灯片幻灯片在课堂上向我解释的内容。我必须编写一个带有用户输入操作符的方案程序,然后对其后面的数字执行该操作。 (换句话说,实现我自己的方案版本内置'+','*'等操作符)。问题是我必须使用递归。试图围绕这个方案语法进行操作让我很难弄清楚从哪里开始。
所以,我决定从一些代码开始,至少递归地总结用户输入的值(不必担心识别用户输入操作符和括号)。我只是简单无法弄清楚如何使它工作。这是我正在尝试的:
(define run (lambda (x)
(cond
((eqv? x "a") (display x) )
(else (+ x (run(read))))
)))
(run (read))
检查x是否等于“a”的条件是我现在打破递归的一种方式。在最终版本中,输入将在一组括号之间,但我认为当我来到它时我会越过那座桥。无论如何,代码只是继续接受输入,并且永远不会停止。因此,显示x的条件永远不会被调用。我知道我可能做错了什么,我真的很感激一些指示。
编辑:好的,我至少开始意识到某些事情没有意义。比如我的显示x实际上不会给出总和,因为我没有以任何方式存储x中的总和。但是,当我输入字母a时,我仍然不明白为什么代码不会停止。
编辑2:我已经让它工作但只有当条件等于1.我怎么能让它识别一个char的输入或更好的但是右括号来让它结束递归就像它与1? :
(define run (lambda (x)
(cond
((eq? x 1) 0)
(else (+ x (run(read))))
)))
(run (read))
答案 0 :(得分:1)
文件结束(EOF)标志着输入的结束。 Scheme有一个程序eof-object?
。您的代码基本上是正确的:
(define (run x)
(if (eof-object? x)
0
(+ x (run (read)))))
您使用Control-D
结束运行。如果由于某种原因您无法访问eof-object?
,请使用X
之类的特殊字符。在这种情况下,您的测试将是(eq? x #\X)
答案 1 :(得分:0)
(define (addition-loop)
(let ((answer (read)))
(if (number? answer)
(+ answer (addition-loop))
0)))
一旦输入非数字的内容,这将会中断。
此外,您可以看到,您可以使用零参数函数。
无论如何,代码的问题在于你输入一个读取,它的值实际上是一个'a或(引用a),而不是“a”。
(eqv? 'a "a")
;Value: #f