一个简单的Racket终端交互

A simple Racket terminal interaction

我刚开始学习 Racket-lang,我想编写一个简单的程序,从终端读取数据,对输入进行处理并做出响应。

这是 Python 中的程序:

while True :
    l = raw_input()
    print somefunction(l)

我应该如何在 Racket 中编写等价物?

racket 中那个程序的等价物是这样的:

(for ([line (in-lines)])
  (displayln (some-function line)))

这就是如果您只想将结果打印到标准输出。如果您想将结果用作传递给其他表达式的值,for/list returns 这些值的列表:

(for/list ([line (in-lines)])
  (some-function line))

哪个更有用,因为该列表可以被程序的其他部分使用。但是,它在获得整个列表之前不会为您提供列表,这只会在到达 eof 时发生(如果用户键入 ctrl-D 或等效项)。实际上,您可能希望用户说出特定条件 "I'm done, this is all I'm going to type, at least for now." 为此,您可以使用带有 #:break stop-condition 子句的相同形式:

(for/list ([line (in-lines)]
           #:break (string=? line "done"))
  (some-function line))

对于与用户进行更复杂的交互,您可能希望跟踪随着用户输入更多内容而发生变化的某些状态。在那种情况下,您可以使用 for/fold,或者您可以使用递归函数调用自身来请求更多输入。递归函数往往更灵活。