2010-11-13 15 views
5

Principalmente juego con F # en Linux y me gustaría obtener todas las bibliotecas de GUI necesarias (Gtk, Gdk, Atk, Glib, Pango, Cairo) a las que se hace referencia de forma predeterminada para que pueda usar: open Gtk;; sin ningún mecanografía. Mi mejor conjetura sería modificar la secuencia de comandos FSI de lanzamiento, que por el momento parece que:Cómo forzar a F # interactive a hacer referencia a Gtk # de forma predeterminada?


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

Actualización: versión del guión de trabajo como en la sugerencia 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] 

Respuesta

8

Escribí una pequeña secuencia de comandos que le permite usar Gtk # de F # Interactive (consulte a continuación). Hace referencia a los ensamblados Gtk # necesarios (es posible que deba modificar las rutas) y también configura F # evento interactivo, de modo que puede crear y visualizar widgets (como Window) de forma interactiva.

Si desea obtener el apoyo de forma automática, tendrá que ejecutar fsi.exe con un parámetro para cargar la secuencia de comandos en el arranque mono /.../fsi.exe --load:load-gtk.fsx (suponiendo que guarde el script como 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

Como dije en la pregunta, la modificación del guión fue "mi mejor estimación". Esta respuesta presenta un enfoque mucho mejor. Gracias Tomás –

3

Puede ser un poco diferente en Linux, pero en Windows puede hacer referencia a los ensamblados en el inicio de fsi usando -r. p.ej.

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

Debe usar ' "$ @" 'para preservar cualquier cita que se haga en estos argumentos de scripts. –

2

estoy adivinando añadir

-r:/path/to/gtk 

o

--load:someStartupScript.fs 

la que tal vez incluye algunos #r s o lo que sea. fsi /? y lo resolverás.

Cuestiones relacionadas