[Nix-dev] Use Haskell for Shell Scripting

Michael Raskin 7c6f434c at mail.ru
Tue Feb 10 16:50:54 CET 2015


>> I think you are thinking too big-system-design instead of
>> quick-scripting about that.
>
>Let's say I don't draw a line between small systems and large systems
>when it comes to abstractions, because algebraic abstractions are cheap.
>
>IMO a minimum requirement for a language to be called "functional" is
>that functions are cheap.  I mean cheap as in "almost free", just like
>mutable variables are almost free in imperative programming.
>Quantification ("generics" in most languages) must be entirely free.
>It's not in C++, but in boxing languages it is.
>
>Now if quantification is free and your functions are almost free, then
>algebraic abstractions are also almost free.  You might as well use them
>everywhere, even in your quick-n-dirty scripts, because they make your
>code shorter, more maintainable and usually more readable as well
>(especially the types).
>
>While you're reading this you should not think of OOP.  OO abstractions
>are expensive in every way.  They make your program slower and your
>source code longer.  They are not suitable for quick-n-dirty scripts.

Data type declarations are not free in any case, I think.  

>> I have added an external module to StumpWM that goes completely
>> against the default logic of connecting screens, workspaces and
>> windows.
>>
>> It just moves windows between the workspaces when it needs to.
>>
>> I still use the hard parts of a WM (X protocol handling) and just
>> added my own implementation of the fun parts.
>
>Yeah, that sounds pretty much like what I do right now, except with a
>different WM at the core.

Well, you started talking like you were considering some limitation of 
XMonad hard to work around.

>> I think I was not clear with my idea about Ratpoison. I meant the Unix
>> way of doing things: there is Ratpoison that can easily receive
>> commands to change the splits and move the windows. Your logic is in
>> Haskell and it just sends commands to Ratpoison (which has been
>> debugged once).
>
>The Unix philosophy can manifest in a number of ways.  Usually you make
>programs pipe-friendly and perhaps add a configuration file.  That's the
>traditional approach, which has one huge drawback:  When communicating
>all structure must be flattened, because pipes understand only the
>"stream of bytes" notion.  Then at the receiving end the structure must
>be recovered from the byte-stream.  For long-running programs like a WM
>it also means that you need to act non-blockingly and handle errors
>sensibly.
>
>An interesting alternative is that you don't make your program a
>"program" in the first place.  After all what is a "program"?  It's a
>library together with a `main` procedure.  Just leave out `main`.  Now
>it's just a library and "configuring" amounts to the user writing an
>actual program that uses the library.  That way there is no need to go
>through the flatten-and-recover process from above.  You can stay within
>the language's type system.  That's what most Haskell programs do,
>including xmonad.
>
>So I'm probably already doing what you're suggesting, except that it
>doesn't look like Unix, because there is no "pipe" involved. =)

Well, with sockets it is easier to do decoupling, and cross-language
development. 





More information about the nix-dev mailing list