OCaml中的主要功能

Posted

技术标签:

【中文标题】OCaml中的主要功能【英文标题】:The main function in OCaml 【发布时间】:2015-04-27 00:09:39 【问题描述】:

来自受过 C 世界培训的程序员,这是我使用 OCaml 的主要方法。

let main () = 
    Printf.printf "Hello, world - %d %s\n" (Array.length Sys.argv)  Sys.argv.(0)
    ;;

main ()

但是,此代码在 ocaml/ocamlc/ocmalopt 中运行良好。

Printf.printf "Hello, world - %d %s\n" (Array.length Sys.argv)  Sys.argv.(0)
;;

这背后的逻辑是什么? OCaml 是否类似于脚本语言(即使它使用 ocamlc 或 ocamlopt 编译成二进制文件),因为它不需要主函数?

相对于 Scala,我们可以从 App 扩展,从而不定义 main 方法。

object Hello extends App 
    class A

    println(new A() getClass())
    print("Hello, world")

即使在这种情况下,我们在解释器模式下执行它时也需要Hello.main(args):即scala hello.scala。 OCaml 似乎不需要对 ocaml(已解释)、ocamlc 和 ocamlopt(已编译)进行任何更改。

那么,我们需要 OCaml 中的 main 函数吗?如果是这样,OCaml 是否只是从代码的开头到结尾生成代码?如果是这样,OCaml如何找到具有多个源代码的主代码?

【问题讨论】:

请注意,在许多语言中,您可以在主函数之前在全局范围内定义变量,这需要在主函数开始之前执行代码。如果您允许对全局定义产生副作用,为什么不能有任何声明? @didierc:你能详细说明一下吗? 任何支持对象的语言都有它们的构造函数,所以如果你在全局范围内声明实例,运行时有两种可能性:在运行 main 之前创建它们,或者懒惰地等到变量被实际访问。 Java 和 C++ 将前者用于静态全局对象。但是,在 Ocaml 的情况下,语言的功能特性允许它:) @didierc:我明白了。谢谢。 【参考方案1】:

不,OCaml 中不需要 main 函数,它会从头到尾解析代码。

当您有多个文件时,您需要按顺序编译它们(或使用前向引用)

【讨论】:

【参考方案2】:

OCaml 有点像脚本语言,因为在启动程序时会评估任何***表达式。通常有一个名为main 的函数来调用程序的主要工作。但这根本没有必要。

表达式按照 OCaml 文件在链接到可执行文件时出现的顺序进行评估。这通常意味着对main 的调用是启动程序时发生的最后一件事。其他文件通常出现在包含main的文件之前,并且这些文件的任何***代码都会首先执行。

【讨论】:

以上是关于OCaml中的主要功能的主要内容,如果未能解决你的问题,请参考以下文章

OCaml 中的整数取幂

初始化变量OCaml

OCaml - 在实现我的 rev 功能时需要一些帮助

OCaml 中的依赖类型

OCaml 中的“and”关键字是啥意思?

OCaml 中的 D 类不可变数据切片