一个简单的Racket终端交互

int*_*tar 3 racket

我刚开始学习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,或者您可以使用调用自身的递归函数来请求更多输入.递归函数往往更灵活.

  • 明确地编写递归函数是开始学习的好方法.后来?你可以学习命名`let`,例如`(let loop [bindings] ....(loop))`这只是一个函数的糖("loop"只是一个函数名;你可以用它来命名).甚至更晚?您可以了解到`for`宏扩展为您可以手动编写的类似功能代码 - 它不是Racket内置的某种命令性循环功能. (3认同)