Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use stdin pipe with fsharpi (fsi) and mono

Tags:

.net

linux

mono

f#

i am using fsharpi (fsi) as background compiling process using System.Diagnostics.Process to spawn the process. My ProcessStartInfo Setup looks like:

let psi = new ProcessStartInfo()
psi.UseShellExecute <- false
if System.Environment.OSVersion.Platform = PlatformID.Unix
    then
        psi.FileName <- "/usr/bin/mono"
        psi.Arguments <- "/usr/lib/fsharp/fsi.exe"
    else
        psi.FileName <- @"C:\Program Files (x86)\Microsoft F#\v4.0\fsi.exe"
        psi.Arguments <- ""
psi.WorkingDirectory <- "some workdir"
psi.CreateNoWindow <- true
psi.RedirectStandardError <- true
psi.RedirectStandardInput <- true
psi.RedirectStandardOutput <- true

my Process is created like:

let proc = Process.Start(psi)

afterwards i use stdin to emit my code:

proc.StandardInput.WriteLine(myCode+";;"+Environment.NewLine)
proc.StandardInput.Flush()

this works on Windows 7 with VisualStudio with standard setup - unfortunately it does not work on linux (ubuntu 11.04, Mono JIT compiler version 2.6.7 (Debian 2.6.7-5ubuntu3), F#, Microsoft (R) F# 2.0 Interactive build 2.0.0.0) [Note: same for mono 2.10 built from source]. Anyhow StandardOutput works on both platforms just fine.

EDIT: to clarify how/what does not work: after receiving standard startup output (F#, Microsoft (R) F#...) i send some code (lets say let foo x = x * 2) via redirected input stream. The answer is received synchronously (in another thread) using redirected output (using proc.StandardOut.ReadLine() but ReadLine never returns!

I suspect it is a problem with (the extra process) mono in which fsharpi is running or a platform issue (newline etc).

To rule out the second possibility i tried manual pipes. To do so i created a file with content:

"#quit;;[NEWLINE]"

whereby [NEWLINE stands for Unix endlines and windows style EOL]

using following command (windows):

fsi.exe < thefileDescribedAbove

or respectively (linux)

fsharpi < thefileDescribedAbove

like expected it works on Windows (opens FSI and quits immediately) but stalls on linux (like ;; or NEWLINE is not received). Given the strange result in this test i suspect a more fundamental problem with my approach (hopefully not).

thanks a lot

like image 749
h_s Avatar asked Nov 04 '22 15:11

h_s


1 Answers

after a long senseless bughunt: "--readline-" argument to fsi fixes the problem! thanks to all tracking this down :-)

(actually i tried this a long time ago - apparently i messed something up with my test at that time)

like image 71
h_s Avatar answered Nov 09 '22 12:11

h_s