<html><head></head><body><div style="color:#000; background-color:#fff; font-family:HelveticaNeue-Light, Helvetica Neue Light, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px"><div id="yui_3_16_0_ym19_1_1483968170908_17518" dir="ltr"><span id="yui_3_16_0_ym19_1_1483968170908_17640">I found the answer myself. It seems that I need to supply the full path to the swift REPL executable. I don't understand why it requires it for swift because it could call python executable just fine without using full path. Anyway, problem solved. :)</span></div><div></div><div id="yui_3_16_0_ym19_1_1483968170908_17665"> </div><div class="signature" id="yui_3_16_0_ym19_1_1483968170908_17667"><div id="yui_3_16_0_ym19_1_1483968170908_17666"><br></div>–Mr Bee<div id="yui_3_16_0_ym19_1_1483968170908_17690"><br></div></div> <div class="qtdSeparateBR"><br><br></div><div class="yahoo_quoted" style="display: block;"> <div style="font-family: HelveticaNeue-Light, Helvetica Neue Light, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 16px;"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 16px;"> <div dir="ltr"><font size="2" face="Arial"> Pada Senin, 9 Januari 2017 12:51, Mr Bee <pak.lebah@yahoo.com> menulis:<br></font></div>  <br><br> <div class="y_msg_container"><div id="yiv9040706174"><div><div style="color:#000;background-color:#fff;font-family:HelveticaNeue-Light, Helvetica Neue Light, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;"><div id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17537"><span>Hi,</span></div><div id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17537"><span><br></span></div><div id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17537" dir="ltr"><span id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_19496">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.</span></div><div id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17537" dir="ltr"><span><br></span></div><div id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17537" dir="ltr"><span>Here's the code:</span></div><div id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17537" dir="ltr"><span><br></span></div><div id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17537" dir="ltr"><span>_____ start code _____</span></div><div id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17537" dir="ltr"><span><br></span></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_21993">program Execute;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_21994"><br id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_21995"></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_21996">uses</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_21997">  SysUtils, Process; </div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_21998">  </div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_21999">function ExecCmd(const ExeName: string; const Params: array of string; </div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22000">                 var OutText: string; InText: string = ''): boolean;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22001">const</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22002">  READ_BYTES = 65536;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22003">var</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22004">  proc: TProcess;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22005">  i, numBytes, bytesRead, </div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22006">  outputLength, available: integer;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22007">begin</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22008">  proc := TProcess.Create(nil);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22009">  proc.Executable := ExeName;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22010">  proc.Options := [poUsePipes, poStderrToOutput];</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22011"><br id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22012"></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22013">  // set params</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22014">  if high(Params) >= 0 then</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22015">    for i := low(Params) to high(Params) do</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22016">      proc.Parameters.Add(Params[i]);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22017"><br id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22018"></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22019">  // execute</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22020">  bytesRead := 0;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22021">  outputLength := 0;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22022">  try</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22023">    try</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22024">      proc.Execute;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22025"><br id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22026"></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22027">      // write stdin data</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22028">      if InText <> '' then begin</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22029">        InText := InText + LineEnding;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22030">        proc.Input.Write(InText[1], Length(InText));</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22031">      end;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22032"><br id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22033"></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22034">      while proc.Running do</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22035">      begin</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22036">        // read stdout size</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22037">        available := proc.Output.NumBytesAvailable;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22038">        if available > 0 then</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22039">        begin</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22040">          if (bytesRead + available) > outputLength then</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22041">          begin</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22042">            outputLength := bytesRead + READ_BYTES;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22043">            SetLength(OutText, outputLength);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22044">          end;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22045"><br id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22046"></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22047">          numBytes := proc.Output.Read(OutText[1+bytesRead], available);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22048">          if numBytes > 0 then Inc(bytesRead, numBytes);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22049">        end</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22050">        else</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22051">          Sleep(10);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22052">      end;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22053"><br id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22054"></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22055">      // read stdout data</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22056">      available := proc.Output.NumBytesAvailable;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22057">      while available > 0 do</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22058">      begin</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22059">        if (bytesRead + available) > outputlength then</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22060">        begin</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22061">          outputLength := bytesRead + READ_BYTES;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22062">          SetLength(OutText, outputLength);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22063">        end;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22064"><br id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22065"></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22066">        numBytes := proc.Output.Read(OutText[1+bytesRead], available);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22067">        if numBytes > 0 then Inc(bytesRead, numBytes);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22068">        available := proc.Output.NumBytesAvailable;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22069">      end;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22070">      SetLength(OutText, bytesRead);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22071">      </div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22072">      Result := true;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22073">    except</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22074">      // failed</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22075">      on e : Exception do</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22076">        begin</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22077">          Result := false;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22078">          SetLength(OutText, bytesRead);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22079">        end;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22080">    end;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22081">  finally</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22082">    proc.Free;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22083">  end;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22084">end;</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22085"><br></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22117">var</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22118">  s: string = '';</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22119">begin</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22120">  ExecCmd('/bin/ls',['-l'],s);        // <- OK<br></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22128">  //ExecCmd('swift',['test.swift'],s);  // <- FAILED!</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22129">  //ExecCmd('python',['test.py'],s);    // <- OK</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22130">  <br></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22136">  writeln(s);</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22137">end.</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22137"><br></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22137">_____ end code _____</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22137"><br></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22137">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?</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22137"><br></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22137">I'm on FPC v.3.0, Linux Ubuntu 14.04, and Swift v.3.0.</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22137"><br></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22137">Thank you.</div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22137"><br></div><div dir="ltr" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_22137">Regards,</div><div></div><div id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17536"> </div><div class="yiv9040706174signature" id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17534"><div id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17535"><br></div>–Mr Bee<div id="yiv9040706174yui_3_16_0_ym19_1_1483940019235_17533"><br></div></div></div></div></div><br><br></div>  </div> </div>  </div></div></body></html>