Функция применяется к слишком многим аргументам в lablgtk

Мне нужна помощь в понимании того, почему следующий код не будет компилироваться. Я пытаюсь разместить GSourceView2 внутри вертикального поля в lablgtk. Я адаптировал код из этой статьи о Ocaml

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, так и для GSourceView2.source_view выглядят очень похожими (за множеством необязательных аргументов следует единица), поэтому я не совсем уверен, что мне не хватает. Любая помощь в том, что я пропускаю, была бы очень полезна, поскольку я все еще довольно плохо знаком с этим языком.

2 ответа

Решение

Поскольку вы новичок в этом языке, я также дам вам краткий обзор того, как я решил эту проблему, чтобы вы могли почувствовать окружающую среду... к сожалению, иногда это может быть болезненным.

Таким образом, ошибка, которую вы получили, подразумевала отсутствие cma или же cmxa (Я не уверен, что вы использовали 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.cma или же find . -name lablgtksourceview2.cma, На моей платформе OS X также не существовало. После некоторой проверки на сайте lablgtk и общего поиска в Google это произошло потому, что на моей машине не было соответствующего кода gtk.

для людей OCaml на OS X вам нужно

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/

для людей OCaml на компьютерах, основанных на Debian, это должно включать 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 stackru.ml, you can also use ocamlopt instead of ocamlc *)

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

затем ./SanityCheck который работал для меня на OS X.

Используя new вы вызываете конструктор класса с одним аргументом GSourceView2.source_view, а не функция многих аргументов GSourceView2.source_view,

Хотя я не знаком с библиотекой Gtk, кажется, что функции с тем же именем, что и у классов, будут возвращать экземпляр этих классов, так что вы, вероятно, можете решить свою проблему, просто удалив new,

Другие вопросы по тегам