3 ms·
I found another, possibly simpler solution. The functions (sh-fd-stdin) (sh-fd-stdout) and (sh-fd-stderr) return the integer file descriptors that a schemesh b
by cosmos0072 2y ago
I found another, possibly simpler solution.
The functions (sh-fd-stdin) (sh-fd-stdout) and (sh-fd-stderr) return the integer file descriptors that a schemesh builtin should use to perform I/O.
With them, you can do
true (lambda () (lisp-expr-writes-to-fd (sh-fd-stdout))) | grep foo | true (lambda () (lisp-expr-reads-from-fd (sh-fd-stdin)))
It should work :)
- pama 2y agoCould this be abstracted enough with the right macros to make a subset of useful lisp commands play well with the shell? It could be a powerful way to extend the shell for interactive use.
- cosmos0072 2y agoYes, that's definitely feasible. I am currently working on it, the macro will be named (shell-expr) and replace the current experimental (shell-test)
- cosmos0072 2y ago[UPDATE] (shell-expr) is ready and kicking :) Now you can write (import (schemesh all)) (shell-expr (lisp-expression-writing-to-sh-fd-stdout)) | some-shell-command-and-args | (shell-expr (lisp-expression-reading-from-sh-fd-stdin)) An example of such expressions is: For writing to sh-fd-stdout, (fd-write (sh-fd-stdout) (string->utf8b "hello\n")) For reading from sh-fd-stdin, (display (utf8b-bytespan->string (fd-read-until-eof (sh-fd-stdin))))