Preliminary Design for HaSh

Top-level components

HUILE - Haskell UI Library for Extension

A C-callable library providing a Haskell interpreter/compiler. It should allow primitive-level extension using a tool like Green Card, if not Green Card itself. Compare Tcl and Guile.

HEMT - Haskell Expressions for Mime Types

A Haskell library of types representing MIME types. These can be used as types for specialized versions of shell commands. For example, you can match on the kind of input file to specialize functionality.

LoSE - Library of Shell Expressions

A Haskell 98 library of shell utilities. It should provide functionality equivalent to a typical shell (both built-ins and executables), while being strongly typed and purely functional.

HaSh - Haskell Shell

Glue together HUILE, LoSE, and GNU readline, and we have a shell. Note that there will be some interesting user interface design (despite the fact that this is a textual shell). For example, most shells have a highly stateful environment. The current working directory is a particularly un-functional concept. However, forcing shell users to pass around a directory all the time would be a pain.

Careful design of the types of some built-ins, combined with careful design of the textual display of those built-ins, might alleviate this somewhat. For example, consider 'cd' and 'ls':

cd :: Path -> IO Environment
ls :: IO Environment -> [ Path ]

If the command line implicitly has the return value of the previous expression, then this might work well. It actually leads, oddly, to a highly stateful way of using shell commands by typing in expressions piecemeal and seeing how they evolve.

Of course, this isn't fully thought out - for one thing, the arguments are in the wrong place. For another, it has no support for options to 'ls' or 'cd'.

MHAK - Making Haskell Aware of KDE

Bindings from Haskell to KDE and Qt. There are some interesting aspects here, as Qt pre-processes C++ code to insert some grotty stuff to automate some of the tedium of UI programming (I'm thinking specifically of the whole signal/slot mess). A direct Haskell binding may be able to obviate most of that grot, and call "raw Qt" directly.

KHaSh - KDE-aware Haskell Shell

Add MHAK to HaSh. In particular, KHaSh should be aware of its state (ugh :-) when the user logs out and come back right where it was left. Bash does some of this with its history file, sort of, but it isn't integrated into KDE (so KDE thinks there's unsaved data). This should of course support all sorts of nifty option dialogs and such.

Another neat trick that should be supported is drag and drop. Drag an expression from one KHaSh to another, or drop on a source file, or even a data file (making it the argument of the next function call, perhaps)

HOOKHA - HaSh's Object-Oriented KDE panel of Haskell Applications

This is an add-on for KHaSh. It's a place to drop Haskell expressions, where they become push buttons that can be dragged back to the shell or activated directly.

Coming up with a way to automatically provide useful icons for the expressions should be interesting.

KHOP - KDE-aware Haskell Object for the Panel

A KDE-aware Haskell expression that sits in kpanel and runs periodically. This could be used for biff-like uses, or automated news monitoring or background music or any number of other things.

©David Brookshire Conner
Last modified: Wed Sep 15 17:08:14 EDT 1999