Hi,
I'm writing a simple editor for Swift language. I use TProcess to run the Swift 
REPL. Unfortunately, TProcess failed to execute the Swift REPL for no obvious 
reasons. The Swift compiler and REPL are installed just fine and able to 
execute any Swift codes. My exact same code has no problem to run other 
executable files, like bash or Python interpreter.
Here's the code:
_____ start code _____
program Execute;
uses  SysUtils, Process;   function ExecCmd(const ExeName: string; const 
Params: array of string;                  var OutText: string; InText: string = 
''): boolean;const  READ_BYTES = 65536;var  proc: TProcess;  i, numBytes, 
bytesRead,   outputLength, available: integer;begin  proc := 
TProcess.Create(nil);  proc.Executable := ExeName;  proc.Options := 
[poUsePipes, poStderrToOutput];
  // set params  if high(Params) >= 0 then    for i := low(Params) to 
high(Params) do      proc.Parameters.Add(Params[i]);
  // execute  bytesRead := 0;  outputLength := 0;  try    try      proc.Execute;
      // write stdin data      if InText <> '' then begin        InText := 
InText + LineEnding;        proc.Input.Write(InText[1], Length(InText));      
end;
      while proc.Running do      begin        // read stdout size        
available := proc.Output.NumBytesAvailable;        if available > 0 then        
begin          if (bytesRead + available) > outputLength then          begin    
        outputLength := bytesRead + READ_BYTES;            SetLength(OutText, 
outputLength);          end;
          numBytes := proc.Output.Read(OutText[1+bytesRead], available);        
  if numBytes > 0 then Inc(bytesRead, numBytes);        end        else         
 Sleep(10);      end;
      // read stdout data      available := proc.Output.NumBytesAvailable;      
while available > 0 do      begin        if (bytesRead + available) > 
outputlength then        begin          outputLength := bytesRead + READ_BYTES; 
         SetLength(OutText, outputLength);        end;
        numBytes := proc.Output.Read(OutText[1+bytesRead], available);        
if numBytes > 0 then Inc(bytesRead, numBytes);        available := 
proc.Output.NumBytesAvailable;      end;      SetLength(OutText, bytesRead);    
        Result := true;    except      // failed      on e : Exception do       
 begin          Result := false;          SetLength(OutText, bytesRead);        
end;    end;  finally    proc.Free;  end;end;
var  s: string = '';begin  ExecCmd('/bin/ls',['-l'],s);        // <- OK
  //ExecCmd('swift',['test.swift'],s);  // <- FAILED!  
//ExecCmd('python',['test.py'],s);    // <- OK  
  writeln(s);end.
_____ end code _____
The test code called by the REPL is just a simple hello world program, nothing 
fancy. Can anyone here enlighten me what did I do wrong in the code above?
I'm on FPC v.3.0, Linux Ubuntu 14.04, and Swift v.3.0.
Thank you.
Regards, 
–Mr Bee
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to