<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>just putting this in writing helped a lot: I'll give solution 3 a try (see below). I'd still love to pair with Racketeers, so let me know if u're interested. Unfortunately, noone here at <a href="https://www.hackerschool.com/">Hacker School</a> wants to do any Racket, everyone's hyped by Clojure, JavaScript and Python. Feeling so lonely :)  </div><div><br></div><div>----- original post -------</div><div><br></div>Anyone wants to brainstorm porting scsh to Racket? I'm having an architectural block here, would appreciate any help. <div><br></div><div>I already have syntactic niceties of scsh transcribed into lower-level calls [<a href="https://github.com/vkz/skish">github</a>]. Deciding what those calls should be is where I'm stuck. I'll be happy to just spawn new processes and have them communicate for now. I hoped I could get away with mostly using Racket's (subprocess ..), but unfortunately it only works for invoking external stuff. So having a pipe like this won't work:</div><div><br></div><div></div><blockquote type="cite"><div>(run </div><div>    ((| (ls) </div><div>        (begin . (some racket code here))</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>(some other external program here))</div><div>    (> (current-error-port) LogFile))</div></blockquote><div><br></div><div>Notice the (begin ..) form in the middle. (subprocess ..) is a <a href="https://github.com/plt/racket/blob/master/racket/src/racket/src/port.c">primitive written in C</a> [thx to nice people on #racket IRC for pointing it out]. If I had primitives like fork and exec, I could just follow along the <a href="https://github.com/scheme/scsh">original implementation</a> or <a href="https://github.com/ChaosEternal/guile-scsh">guile-scsh</a>. Guile has access to almost full library of Posix syscalls, which I think were written for scsh to begin with. It seems wasteful to throw away all the work in Racket's <a href="https://github.com/plt/racket/blob/master/racket/src/racket/src/port.c">port.c</a> that basically hides the mess of dealing with Unix fdes from you (among other things) - its 10'000 lines of C code!</div><div><br></div><div>Right now I have three possible solutions in mind:</div><div><br></div><div>1 - Racket/ffi fork and exec from the C world and follow in the footsteps of original implementation. This means writing C, messing with Racket's ffi, messing with proper treatment of Unix file-descriptors with garbage collection in mind, etc. </div><div><br></div><div>2 - with above pipe example in mind wrap the (begin ...) bit in a separate thread or something, spawn external stuff through calls to (subprocess ..). Basically do some concurrency magic [again, pointed on #racket IRC].</div><div><br></div><div>3 - i'm overcomplicating things. Just (make-pipe) inside (begin ..) and (subprocess _ pipe-in _ ..) the next external process.</div><div><br></div><div>I'm in EST timezone, so can pair with anyone in US (skype, facetime, ...), unless you find it weird, in which case email or IRC me. </div><div><br></div><div><div><div apple-content-edited="true">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">---</div><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Vlad Kozin <<a href="mailto:vladilen.kozin@gmail.com">vladilen.kozin@gmail.com</a>><br><br><br></div></div>
</div>
<br></div></div></body></html>