[plt-dev] #lang: the stake in Dracula's heart?

From: Eli Barzilay (eli at barzilay.org)
Date: Mon Feb 1 17:02:26 EST 2010

On Feb  1, Carl Eastlund wrote:
> Tool registration is stored with each collection or planet package,
> not in a preference file.

(Same point applies.)

> As for using two ".lisp" language levels, well, automatic detection
> just wouldn't work.  You'd have to manually switch each time you
> opened a file in whichever one wasn't the current default.  There's
> no real way around this.

I think that it's generally healthier to think about it in terms of
running some file through mzscheme.  There's no drscheme around to ask
you what you mean.

> > One concrete suggestion that would be easy to work with now is
> > something like (using r6rs as an example):
> >
> >  #lang indirect "foo.scm" r6rs
> >
> > which would make the reader parse "foo.scm" using the r6rs syntax.
> > To make it a little more convenient to use, DrScheme could have some
> > special treatment of such a language -- like presenting you with a
> > buffer that has
> >
> >   #lang r6rs
> >   ...the contents of "foo.scm"...
> >
> > with a different color for the #lang line or something like that.
> > This is still inconvnient in the sense that it requires an actual file
> > to work, but there's probably some way to go around this, like
> >
> >  #lang indirect STDIN r6rs
> >
> > or something.
> It sounds like the above solves the problem of "what do you run when
> you open a non-#lang file" by declaring that you can't, you must
> always open a #lang file.  Meaning a user trying to run a set of ACL2
> libraries could only run them in DrScheme by creating a "#lang
> indirect" file for each one they wanted to try.

DrScheme can be made to pretend (relatively easily, I think) that some
"#lang"-less buffer really has the right "#lang indirect STDIN r6rs"
contents, or something like that.  In any case, I don't consider it
important to think about drscheme-specific problems -- I believe that
finding a good solution at the mzscheme level is bound to lead to a
drscheme solution.

> > Using something like that I can imagine extending mzscheme with a
> > command line flag for the module to run.  Something like:
> >
> >  mzscheme --program '#lang scheme (+ 1 2)'
> >
> > might work nicely -- and assuming that, you can finally do
> >
> >  mzscheme --program '#lang indirect "file.scm" r6rs' file.scm
> >
> > which could then be sugared into some
> >
> >  mzscheme --program-language r6rs file.scm
> Or, if we have non-#lang language levels, how about:
> mzscheme --language-level acl2 "file.lisp"

I think that you're missing the point.  What I was suggesting in all
of the above is that (translating back to acl2):

  mzscheme --program-language acl2 file.lisp

becomes shorthand for

  mzscheme --program '#lang indirect "file.lisp" acl2' file.lisp

which makes mzscheme run AS IF it was requiring a file with this

  #lang indirect "file.lisp" acl2

(only as if -- no actual file), and finally that will read from
"file.lisp" using the acl2 language reader.

So -- no "#lang" needed in the file; the language specification is
completely done with a flag.

          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
                    http://barzilay.org/                   Maze is Life!

Posted on the dev mailing list.