这是我使用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)
,然后重新编译并重新运行。该功能已经定义和编译。有什么方法可以不重新编译就打印出答案吗?
欢迎任何提示和技巧。
答案 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
获取命令行参数并在运行时传递值。