2010-11-13 13 views
5

Principalmente sto giocando con F # su Linux e vorrei avere tutte le librerie GUI necessarie (Gtk, Gdk, Atk, Glib, Pango, Cairo) a cui fare riferimento in modo predefinito in modo da poter usare semplicemente: open Gtk;; senza ulteriori digitando. La mia ipotesi migliore sarebbe modificando lo script FSI di lancio, che al momento sembra che:Come forzare F # interattivo a fare riferimento a Gtk # per impostazione predefinita?


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

Aggiornamento: versione dello script di lavoro come nel suggerimento di 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] 

risposta

8

Ho scritto un piccolo script che consente di utilizzare Gtk # da F # Interactive (vedere sotto). Fa riferimento agli assembly Gtk # necessari (potrebbe essere necessario modificare i percorsi) e configura anche il ciclo di eventi interattivi F #, in modo che sia possibile creare e visualizzare i widget (come Window) in modo interattivo.

Se si desidera ottenere il supporto automaticamente, è necessario eseguire fsi.exe con un parametro per caricare lo script all'avvio mono /.../fsi.exe --load:load-gtk.fsx (supponendo che si salva lo script come 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

Come ho detto nella domanda, la modifica della sceneggiatura era "la mia migliore ipotesi". Questa risposta presenta un approccio molto migliore. Grazie Tomas –

3

Può essere un po 'diverso in Linux, ma in Windows è possibile fare riferimento agli assiemi sull'avvio di fsi usando -r. per esempio.

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

Si dovrebbe usare ' "$ @" 'per conservare qualsiasi citazione eseguita su questi argomenti degli script. –

2

sto indovinando aggiungere

-r:/path/to/gtk 

o

--load:someStartupScript.fs 

che comprende forse alcune #r s o roba del genere. fsi /? e lo capirai.

Problemi correlati