Ocaml 标准输入接口

丹托巴

我需要使用 ocaml 处理来自 stdin 的用户输入。用户将输入命令,直到他键入退出,然后程序完成。这该怎么做?我知道如何用命令式编程,但我想学习函数式。用户应该根据他的命令操作堆栈中的数据。我也想做一个解析器来处理用户命令。

真的很感谢你的帮助!

理查德-德根

这是您可以使用 OCaml 堆栈库编写的内容的草图。它远非完美,可以在许多方面改进,但总体结构就在这里。

就您的问题而言,最重要的部分是loop功能。它从标准输入中读取一行,并使用模式匹配来结束程序或评估给定的和命令,并递归调用自身以等待另一个命令。

eval函数使用给定参数的模式匹配来做正确的事情。您可以在此处找到该Stack模块的文档

let stack = Stack.create ()

let eval args =
  match args with
  | ["push"; v] -> Stack.push v stack
  | ["pop"] -> begin try print_endline (Stack.pop stack) with
      | Stack.Empty -> print_endline "Stack is empty"
    end
  | ["show"] -> Stack.iter print_endline stack
  | _ -> print_endline "Unrecognized command"

let rec loop () =
  match read_line () with
  | "quit" -> print_endline "Bye"
  | _ as command -> eval (String.split_on_char ' ' command); loop ()


let () =
  loop ()

注意:我通常不喜欢为没有显示大量研究的问题提供完整解决方案的想法,但是,嘿,当您不熟悉函数式编程时,您必须从某个地方开始。

注 2:此代码仅适用于string堆栈。如果您打算存储不同的类型,例如ints,或者如果您希望它是多态的,则需要稍微调整该代码。

编辑:根据评论中的评论,下面是上述代码的改进版本,它不使用全局变量堆栈。

let eval s args =
  match args with
  | ["push"; v] -> Stack.push v s
  | ["pop"] -> begin try print_endline (Stack.pop s) with
      | Stack.Empty -> print_endline "Stack is empty"
    end
  | ["show"] -> Stack.iter print_endline s
  | _ -> print_endline "Unrecognized command"

let rec loop s =
  match read_line () with
  | "quit" -> print_endline "Bye"
  | _ as command -> eval s (String.split_on_char ' ' command); loop s


let () =
  loop (Stack.create ())

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章