Hacker News new | past | comments | ask | show | jobs | submit login
SHCL – An unholy union of Posix shell and Common Lisp (github.com/bradleyjensen)
97 points by rauhl on May 22, 2018 | hide | past | favorite | 27 comments



Anybody remember scsh? Seems a better integration of the shell and Lisp bits if you ask me (although this is a neat hack, don't get me wrong).


There is also rash, with Racket: https://github.com/willghatch/racket-rash


Yes, and it was AWESOME! I never used it as a replacement for bash (no readline support), but a lot of shell scripts were much easier to write and to read in Scheme: full support for mathematical expression, elegant iteration, support for lists, etc., and this very well integrated with shell constructs like pipes and redirections.

I used it a lot and saved me lots of headhaches. It's a pity that the project was abandoned.


Scsh is not practical when used as an interactive shell. Where it shines, however, is with non-interactive scripting use. I use it everyday.


scsh was definitely awesome, and it's not really practical in Common Lisp[0], due to Lisp's unfortunate choice to upcase all symbols. Made sense at the time, but in retrospect I think it was a mistake.

It's a real pity that Franz's modern mode[1] didn't become more popular.

[0]: it's possible, just ugly as hell because either one would have stuff like (|ls| |etc|) or one would have stuff like (|LENGTH| …).

[1]: https://franz.com/support/tech_corner/modern.mode.lhtml


You can use Readtable case :preserve to avoid the ugly-as-hell stuff [1]. Some libraries do this, for example KM [2]

[1] http://clhs.lisp.se/Body/23_ab.htm

[2] http://www.cs.utexas.edu/users/mfkb/km.html


In fact you can have case-sensitive Common Lisp packages that are completely backwards compatible with case-insensitive CL code by settings readtable-case to :invert[1], and this works without any problems for interfacing with external case-sensitive environments.[2] Allegro's modern mode is what you would get if you assume case sensitivity as a default, but portable Common Lisp can handle case sensitivity perfectly fine without breaking backwards compatibility.

[1] https://oneofus.la/have-emacs-will-hack/2011-09-20-common-li...

[2] https://common-lisp.net/project/parenscript/reference.html#s...


I think using all-caps is ugly-as-hell:

    (DEFUN hello-world ()
       (FORMAT T "Hello, world!~%"))


Yeah, as others are saying, the CL spec foresees this with the way readtables work. But, honestly, the default behavior is pretty nice for normal programming tasks.


Yes. As a bonus, the acknowledgements in the scsh manual also features some of the finest writing I've ever read in a technical document: https://scsh.net/docu/html/man.html


It never got readline/libedit support AFAIK. I started once but it never got ready.


If you haven't already, I recommend checking out rlwrap, which you can use to run any ol' program that takes input on stdin and give it readline support. I use it quite a lot, and I have aliases in my .bashrc for wrapping various interpreters (like tclsh, sbcl, ocaml, and my own interpreters), but you can even use it to wrap /bin/cat and have a rudimentary line editor ;)


There is a 64bit port of scsh which installs against scheme48 available on github, fwiw.


Most entertaining readme I've read in awhile. Nice job!


My cousin's a core contrib on [xonsh](https://xonsh.org) which is a posix-compliant python shell. I remember him cackling about making his env completely unusable to anyone else in the world (while giving himself amazing powers)...


Now only if there was a Haskell shell (Hashell?) with monads as UNIX pipes...



Idk about “unholy”. I wish I could make eshell (in Emacs) my full time shell, but certain things like nvm don’t work, etc.


nvm sucks! try n!

https://github.com/tj/n/

seriously, it's so much tidier!


Imho all these tools like nvm, rvm etc are deeply flawed and doesn't really do their jobs all that well.

Where I work we use the nix package manager. Making sure your team is using the same version of node is just a few lines of config away:

  with (import <nixpkgs> {});
  
  mkShell {
    buildInputs [ nodejs-8_x ];
  }
Pinning the whole package tree is just a few more lines away and offers you full reproducibility but I omitted it for brevity.

Another upside is that this approach is language agnostic and works for all tools packaged in the nix package repository.


Unix? Unity?


Pun for “union” most likely. It’s punny because it is part of a Unix. The original title is union I think though.


We've s/unix/union/'d the title.


Thank you!


  It’s punny because it is part of a Unix.
I see what you did there. Nice :-).


I think that's a typo from bullet 2 in the README: "an unholy union of POSIX Shell and Common Lisp"


readme says "an unholy union of POSIX Shell and Common Lisp"




Consider applying for YC's Spring batch! Applications are open till Feb 11.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: