2010-11-13 7 views
5

Je joue principalement avec F # sous Linux et je voudrais que toutes les bibliothèques GUI nécessaires (Gtk, Gdk, Atk, Glib, Pango, Cairo) soient référencées par défaut afin que je puisse simplement utiliser: open Gtk;; sans aucune addition dactylographie. Ma meilleure estimation serait de modifier le script de lancement de fsi, qui, au moment ressemble à ça:Comment forcer F # interactif à référencer Gtk # par défaut?


    #!/bin/sh 
    exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe [email protected] 

Mise à jour: version de travail du script comme dans la suggestion de Stephen:


    #!/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" [email protected] 

Répondre

8

J'ai écrit un petit script qui vous permet d'utiliser Gtk # à partir de F # Interactive (voir ci-dessous). Il fait référence aux assemblages Gtk # nécessaires (vous devrez peut-être modifier les chemins) et configure également la boucle d'événements F # Interactive, de sorte que vous puissiez créer et afficher des widgets (tels que Window) de manière interactive.

Si vous souhaitez obtenir le soutien automatiquement, vous devrez exécuter fsi.exe avec un paramètre pour charger le script au démarrage mono /.../fsi.exe --load:load-gtk.fsx (en supposant que vous enregistrez le script comme 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() =() } 
+0

Comme je l'ai dit dans la question de modifier le script était "ma meilleure estimation". Cette réponse présente une approche bien meilleure. Merci Tomas –

3

Il est peut-être un peu différent sous Linux, mais dans Windows, vous pouvez référencer des assemblys sur le démarrage de fsi en utilisant -r. par exemple.

#!/bin/sh 
exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe -r /usr/somedll.dll [email protected] 
+0

Vous devez utiliser ' "$ @" 'pour conserver les citations faites sur les arguments de ce script. –

2

Je suppose ajouter

-r:/path/to/gtk 

ou

--load:someStartupScript.fs 

qui comprend peut-être quelques #r s ou autres joyeusetés. fsi /? et vous comprendrez.

Questions connexes