我刚开始学习Racket-lang,我想编写一个从终端读取的简单程序,对输入执行操作并做出响应.
这是Python中的程序:
while True :
l = raw_input()
print somefunction(l)
Run Code Online (Sandbox Code Playgroud)
我应该如何在Racket中写出相应的内容?
Ale*_*uth 10
在球拍中相当于该程序将是这样的:
(for ([line (in-lines)])
(displayln (some-function line)))
Run Code Online (Sandbox Code Playgroud)
如果您只想将结果打印到stdout,那就是这样.如果要将结果用作值以传递给其他表达式,请for/list返回这些值的列表:
(for/list ([line (in-lines)])
(some-function line))
Run Code Online (Sandbox Code Playgroud)
哪个更有用,因为该列表可以被程序的其他部分使用.但是,它不会提供列表,直到它可以获得整个列表,只有当它到达eof时才会发生(如果用户键入ctrl-D或等效项).实际上,你可能想要一个特定条件让用户说"我已经完成了,这就是我打算输入的内容,至少目前是这样." 为此,您将使用与#:break stop-condition子句相同的表单:
(for/list ([line (in-lines)]
#:break (string=? line "done"))
(some-function line))
Run Code Online (Sandbox Code Playgroud)
对于与用户进行更复杂的交互,您可能希望跟踪一些随用户输入更多内容而发生变化的状态.在这种情况下,您可以使用for/fold,或者您可以使用调用自身的递归函数来请求更多输入.递归函数往往更灵活.