编译后打印ocaml函数

时间:2019-03-12 22:26:03

标签: ocaml

这是我使用ocaml的第一天。到目前为止喜欢它。我想弄清楚是否有一种方法可以打印函数的结果。这是一个基于Project Euler #5的示例。

我的代码是:

let rec gcd a b =
  if b==0 then a
  else (gcd b (a mod b));;

let rec myans n anssofar=
  if n==1 then anssofar
  else (myans (n-1) ((anssofar*(n-1))/(gcd anssofar (n-1))));;

Printf.printf "%d\n" (myans 20 20)

这很好。然后,我使用以下代码进行编译:

$ ocamlc -o PE0005 PE0005.ml

然后使用

运行它
$ ./PE0005

它会给出答案。

现在,假设我想算出myans 1010。似乎不正确地做我一直在做的事,即回去,将最后一行编辑为

Printf.printf "%d\n" (myans 10 10)

,然后重新编译并重新运行。该功能已经定义和编译。有什么方法可以不重新编译就打印出答案吗?

欢迎任何提示和技巧。

2 个答案:

答案 0 :(得分:4)

一种可能是在顶层(OCaml读取/评估/打印循环)中运行代码。这使您可以更轻松地进行实验。

$ ocaml
# #use "PE0005.ml";;
val gcd : int -> int -> int = <fun>
val myans : int -> int = <fun>
232792560
- : unit = ()
# myans 10 10;;
- : int = 2520

另一种可能性是重写代码以从命令行获取参数。这是您实际上对已编译的命令行程序执行的操作。

let main () =
    if Array.length Sys.argv < 3 then (
        Printf.eprintf "need two integer arguments\n";
        exit 1
    ) else (
        Printf.printf "%d\n"
            (myans (int_of_string Sys.argv.(1)))
    )

let () = main ()

运行时的工作方式如下:

$ ocamlc -o PE0005 PE0005.ml
$ ./PE0005 20 20
232792560
$ ./PE0005 10 10
2520

答案 1 :(得分:1)

您可以使用sys.argv获取命令行参数并在运行时传递值。