函数应用于 lablgtk 中的太多参数

Function applied to too many arguments in lablgtk

我需要一些帮助来理解为什么以下代码无法编译。我试图将 GSourceView2 放置在 lablgtk 的垂直框中。我改编了这个 Ocaml article

中的代码
open GMain
open GdkKeysyms

let locale = GtkMain.Main.init ()

let main () =
  let window = GWindow.window ~width:320 ~height:240
                              ~title:"Simple lablgtk program" () in
  let vbox = GPack.vbox ~packing:window#add () in
  window#connect#destroy ~callback:Main.quit;

  (* Sourceview *)
  let _ = new GSourceView2.source_view ~height:240 ~width:320 ~packing:vbox#add () in

  window#show ();
  Main.main ()

let () = main ()

我得到的错误有点神秘:

Error: This function has type
         GtkSourceView2_types.source_view Gtk.obj -> GSourceView2.source_view
       It is applied to too many arguments; maybe you forgot a `;'.

但是,我可以改为创建一个 GButton 并设置其 pack 参数以将其放置在 vbox 中。 GButton.button and GSourceView2.source_view 的签名看起来非常相似(很多可选参数后跟一个单元),所以我不太确定我遗漏了什么。任何关于我遗漏的帮助都会非常有帮助,因为我对这种语言还很陌生。

通过使用 new,您调用的是 class GSourceView2.source_view 的单参数构造函数,而不是 GSourceView2.source_view.

的多参数函数

虽然我不熟悉 Gtk 库,但似乎与 classes 同名的函数将 return 那些 classes 的实例,所以你可以通过简单地删除 new.

来解决你的问题

由于您是这门语言的新手,我还将向您概述我是如何解决这个问题的,以便您对环境有所了解……不幸的是,这有时会很痛苦。

所以你得到的错误暗示缺少 cmacmxa(我不确定你是否使用 ocamlopt 或 ocamlc)

让我们从源代码开始...我们可以在任何一个

~/.opam/archives/opam source lablgtk。我们进去看到一个 META 文件,这是给 ocamlfind 的。

cat META 之后,我们一直在底部看到这个相关部分。

package "sourceview2" (
  exists_if = "lablgtksourceview2.cma,lablgtksourceview2.cmxa,lablgtksourceview2.cmxs"
  description = "Bindings for gtksourceview2"
  requires = "lablgtk2"
  archive(byte) = "lablgtksourceview2.cma"
  archive(native) = "lablgtksourceview2.cmxa"
)

好的,这意味着我们应该期望 lablgtksourceview2.cma 或 .cmxa 存在。我们可以做到

cd `ocamlfind query lablgtk`

然后我们可以做 locate lablgtksource2.cmafind . -name lablgtksourceview2.cma。在我的平台上,OS X 都不存在。在 lablgtk 站点上进行了一些调查并进行了一般的谷歌搜索后,这是因为相关的 gtk 代码本身不在我的机器上。

对于 OS X 上的 OCaml 用户,您需要

1) opam uninstall lablgtk
(* Make sure that your path is set up correctly for PKG_CONFIG_PATH=/opt/X11/lib/pkgconfig *)
2) brew install gtksourceview libxml2
3) opam install lablgtk lablgtk-extras

最后一步可能会失败。它很可能是 pkg-config 路径问题, 这是我的 PKG_CONFIG_PATH = /opt/X11/lib/pkgconfig/:/usr/local/Cellar/libxml2/2.9.2/lib/pkgconfig/

对于我猜是基于 Debian 的机器上的 OCaml 用户,这应该包括 Ubuntu, 虽然我不确定这是否是正确的包名称。

1) opam uninstall lablgtk
2) apt-get install liblablgtksourceview2-ocaml-dev
(* Not sure what the correct pkgconfig stuff is on linux but shouldn't matter I imagine *)
3) opam install lablgtk lablgtk-extras

你可以在这之后再次检查 .cma 舞蹈,然后检查

 pwd
/Users/Edgar/.opam/4.02.1/lib/lablgtk2
~/.o/4/l/lablgtk2 ❯❯❯ ls *.cma
lablglade.cma          lablgtksourceview2.cma
lablgtk.cma            lablrsvg.cma

是的,相关 cma 存在。 我们还可以仔细检查:

ocamlfind list | grep gtk
lablgtk2            (version: 2.18.0)
lablgtk2-extras     (version: 1.5)
lablgtk2-extras.configwin (version: 1.5)
lablgtk2.auto-init  (version: n/a)
lablgtk2.glade      (version: n/a)
lablgtk2.rsvg       (version: n/a)
lablgtk2.sourceview2 (version: n/a)

还有相关的包,sourceview2。

现在你的代码完全独立了:

#require "lablgtk2.sourceview2"
open GMain
open GdkKeysyms

let locale = GtkMain.Main.init ()

let main () =
  let window = GWindow.window ~width:320 ~height:240
                              ~title:"Simple lablgtk program" () in
  let vbox = GPack.vbox ~packing:window#add () in
  window#connect#destroy ~callback:Main.quit;

  (* Sourceview *)
  let _ = GSourceView2.source_view ~height:240 ~width:320 ~packing:vbox#add () in

  window#show ();
  Main.main ()

let () = main ()

我可以 运行 成功 utop <the_file.ml>

如果您更喜欢使用 ocamlc 或 ocamlopt,则删除以 #require 开头的行,因为它仅适用于 utop,然后执行:

(* I just named it Whosebug.ml, you can also use ocamlopt instead of ocamlc *)

ocamlfind ocamlc -package lablgtk2.sourceview2 -linkpkg Whosebug.ml -o SanityCheck

然后 ./SanityCheck 在 OS X 上对我有用。