Как заставить F # интерактивный ссылаться на Gtk # по умолчанию? - PullRequest
5 голосов
/ 14 ноября 2010

Я в основном играю с F # в Linux и хотел бы получить все необходимые библиотеки GUI (Gtk, Gdk, Atk, Glib, Pango, Cairo) для ссылки по умолчанию, чтобы я мог просто использовать open Gtk;; без каких-либо дополнительных действий. Моим лучшим предположением было бы изменить скрипт запуска fsi, который на данный момент выглядит так:


    #!/bin/sh  
    exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe $@

Обновление: рабочая версия скрипта, как в предложении Стивена:


    #!/bin/sh
    exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe -r "/usr/lib/cli/atk-sharp-2.0/atk-sharp.dll" -r "/usr/lib/cli/glib-sharp-2.0/glib-sharp.dll" -r "/usr/lib/cli/gdk-sharp-2.0/gdk-sharp.dll" -r "/usr/lib/cli/gtk-sharp-2.0/gtk-sharp.dll" -r "/usr/lib/cli/pango-sharp-2.0/pango-sharp.dll" -r "/usr/lib/mono/2.0/Mono.Cairo.dll" $@

Ответы [ 3 ]

8 голосов
/ 14 ноября 2010

Я написал небольшой скрипт, который позволяет вам использовать Gtk # из F # Interactive (см. Ниже). Он ссылается на необходимые сборки Gtk # (вам может потребоваться изменить пути), а также настраивает цикл событий F # Interactive, чтобы вы могли интерактивно создавать и отображать виджеты (например, Window).

Если вы хотите получить поддержку автоматически, вам нужно запустить fsi.exe с параметром для загрузки скрипта при запуске mono /.../fsi.exe --load:load-gtk.fsx (при условии, что вы сохранили скрипт как load-gtk.fsx)

[<AutoOpen>]
module GtkSharp

// Load some common Gtk# assemblies (from /usr/lib/mono/2.0/../gtk-sharp-2.0)
#r "../gtk-sharp-2.0/gtk-sharp.dll"
#r "../gtk-sharp-2.0/gdk-sharp.dll"
#r "../gtk-sharp-2.0/glib-sharp.dll"
#r "../gtk-sharp-2.0/atk-sharp.dll"

open Gtk

Application.Init()
fsi.EventLoop <- 
 { new Microsoft.FSharp.Compiler.Interactive.IEventLoop with
   member x.Run() = Application.Run() |> ignore; false
   member x.Invoke f = 
     let res = ref None
     let evt = new System.Threading.AutoResetEvent(false)
     Application.Invoke(new System.EventHandler(fun _ _ ->
       res := Some(f())
       evt.Set() |> ignore ))
     evt.WaitOne() |> ignore
     res.Value.Value 
   member x.ScheduleRestart() = () }
3 голосов
/ 14 ноября 2010

В Linux это может немного отличаться, но в Windows вы можете ссылаться на сборки при запуске fsi, используя -r.например,

#!/bin/sh
exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe -r /usr/somedll.dll $@ 
2 голосов
/ 14 ноября 2010

Я предполагаю добавить

-r:/path/to/gtk

или

--load:someStartupScript.fs

, который может включать в себя #r или еще много чего. fsi /? и вы поймете это.

...