Donn Cave wrote:
On Wed, 10 May 2006, Donald Bruce Stewart wrote:

Funny this should come up. We've just had several submissions to
work on a functional shell for the google summer of code.

Here's a bit of a summary of what's been done in Haskell I prepared a
while back.

http://www.cse.unsw.edu.au/~pls/thesis-topics/functionalshell.html

My background is more shells than FP, so I'm not sure what to make
of this - if we're talking about doing things for educational
purposes, or serious attempts to make a viable alternative to ...
something.

Here is an example of the kind of thing you could have with a pure interactive Haskell shell:

newtype FileName = FileName String    -- for example
newtype DirName = DirName String

newtype Shell a = Shell (IO a) deriving (Monad, MonadIO)

ls :: Shell [FileName]
cat :: FileName -> [FileName] -> Shell ()

-- run a command with the current directory set to DirName
withDir :: DirName -> Shell a -> Shell a

-- catenate all files in a specified directory

catenate outputFile dir = withDir dir $
                                           ls >>= cat outputFile

Of course the above could no doubt be improved but surely it is already far easier to understand and much more powerful than the idiosyncratic text based approach used in UNIX shells (including rc). To extend the example further, with a simple function to split a filename into a name and an extension, we could rename all .txt files to .hs files with:

split :: FileName -> (String, String)
unsplit :: (String, String) -> FileName
rename :: FileName -> FileName -> Shell ()

rename extFrom extTo files = do
let candidates = filter (\(_,ext) -> ext==extFrom) (map split files) mapM_ (\f@(n,_) -> rename (unsplit f) (unsplit (n, extTo))) candidates

%           ls >>= rename "txt" "hs"

So although the above may be educational, I think it would also be truly useful and practical. It would also save a lot of trouble if everything was done in Haskell instead of using all those UNIX commands, because then people would only need to learn one language to be able to do anything with their computing environment.

Regards, Brian.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to