Prelude/main magicks?
Niklas Broberg
n_broberg at hotmail.com
Fri May 14 11:14:24 EDT 2004
I wrote:
>| Is there some simple way to make GHC treat our own base library in the
>same
>| magic way as the Prelude, so that it is always implicitly available?
[...]
Simon Peyton-Jones wrote:
>A -fprelude-is flag would certainly be implementable. The questions are
>
>
>a) Would it be desirable? After all, there isn't much difference
>between
>
> module Main where { ... }
> ghc -fprelude-is Foo Main.hs
>and
> module Main where { import Foo ... }
> ghc Main.hs
>
>And arguably the latter it better because the code is more
>self-describing.
Well, that all depends on your perspective. =)
Haskell is great as a host for embedded domain specific languages (DSL) and
there are several such languages already (Lava, Pan, Fran, WASH etc.). Such
languages could from one perspective be seen as nothing more than libraries
for Haskell directed at helping you write programs within a certain domain.
>From this point of view, arguably it would be more descriptive to explicitly
import these libraries into any written modules, they are after all "just
libraries".
But if you choose the perspective that these are indeed languages in their
own right, aimed at applications within their domains, I would argue the
other way around.
Taking Lava, a hardware description language, as my example, I would argue
that many users of Lava don't really care if it's embedded in Haskell or
whereever it comes from, they would just use it. I have friends who study
Lava solely for its application to hardware description, and these same
friends would never dream of taking a course in Haskell (or any other
general purpose language). From this perspective, Lava is the Language, and
Haskell is reduced to a backend. Then it would make sense to talk of things
like a Lava compiler, to invoke directly on your Lava source files. And said
compiler would then preferrably be able to provide the users with the
domain-specific functions that make up the "Prelude" of its domain, without
the users having to import anything.
I would definitely argue that from this perspective, the former would be far
more descriptive in the following guise:
module Main where { ... }
lavac Main.hs
where lavac is could simply be a script alias of
ghc -fprelude-is Lava
By using an explicit Lava compiler you declare that this is indeed a Lava
program, and you don't expect it to work in any other setting, in particular
not with a Haskell compiler like GHC.
And in the same line of thinking, I would want a way of specifying suffixes
of input source files. It would be much neater to call your files Foo.lava
or similar, and be able to tell GHC to treat them as normal .hs files, i.e.
lavac <== ghc -hssuf lava -fprelude-is Lava
In my opinion having these flags or not boils down to whether or not GHC
aims at being "the perfect tool" for "embedded compilers", much as Haskell
is allready "the perfect language" for embedding domain specific languages.
Simon Peyton-Jones wrote:
>b) GHC has a myriad of flags. Every time we add one, even a simple one,
>it costs us an hour or two, and (worse) potentially interacts with stuff
>in the future. Each one is "just one little flag" but they do add up!
Aye, there's always a trade off, isn't there?
I wouldn't claim to know how these flags could interact with things in the
future, but seeing that there is already a -fno-implicit-prelude flag makes
me wonder if generalising this to explicitly specified "preludes" makes it
much worse?
For suffixes of input files, I can forsee some problems such as what happens
if you say -hssuf lhs for instance, should the compiler then treat it as a
literate or not-so-literate source file? But I'm sure such issues can be
properly disambiguated, and after that it should (hopefully) be a simple
matter of pretending that the specified suffix is actually .hs.
>I'd be interested to know if lots of people thought this particular one
>was very important, though.
So would I. I sure think so. =)
I wrote:
>| And while I'm asking about magicks; In our language we have a special
>| function, called "page", that we require be present in "executable"
>modules,
>| much like a main-function.
[...]
Simon Peyton-Jones wrote:
>This seems less widely applicable to me; I suggest you use the ideas
>suggested by others in their replies.
I agree, this is not general enough and cannot be said to be applicable to
embedded DSL since most applications written in such languages would still
rely on an ordinary "main :: IO ()" function.
We still have no really good solution to our problem though, so suggestions
are more than welcome. The problem now is to know which modules that must
have said "page" function, i.e. which are the "executables"? If we could get
the hs-suf extension I suggested above, then we could solve it by giving
another suffix to "executable" pages, but for now we need to hack our way
around it.
/Niklas
_________________________________________________________________
Express yourself with the new version of MSN Messenger! Download today -
it's FREE! http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/
More information about the Glasgow-haskell-users
mailing list