Stephen De Gabrielle wrote on 2/6/19 11:25 AM:

Dave Herman recently tweeted

BTW, Dave Herman was a great contributor of Racket (PLT Scheme) packages, and has been missed, though I understand the attraction of Mozilla at the time.

More generally, can you recommend resources a developer (without a background in language design) should refer to if they are building a simple templating system, application configuration file, etc. - that may grow into a little language?

If I could offer a few quick general guidelines instead:

* Consider whether declarative or imperative is better.  Declarative can let you do more static reasoning (even though you might implement by syntactic transformation to imperative Racket), and is often the thing to do.  However, sometimes imperative is what you want even when initially it looks like declarative, especially when you get into the next guideline...

* If you ever find yourself writing bits of an imperative language, consider just exposing a real language, like Scheme.  Even if you don't go for Emacs-like extensibility, there is a long-long history of everyone almost always reinventing a half-butted language when they would've been in a much better position by taking a real language off the shelf.  Perhaps a real language with extensions (like, if you really want a prototype object system, go Scheme with a small layered prototype object system).

* Consider whether your DSL, in which the the two previous guidelines might have you do as a mix of declarative with scattered bits in an off-the-shelf real imperative language... is even better as the off-the-shelf imperative language at the top level, with a couple really well-chosen syntax extensions or procedures.

* Don't be overinfluenced by the above guidelines.  Often, the less we know, the easier it is to make blanket generalizations. :)

Sorry I have to run and can't give a more thoughtful brain dump right now, but quick anecdotes of my own (criticize oneself first) from Racket: two non-public DSLs I made, one for high-performance XML transformation, and one for processing some cool and big tabular data, both make me cringe -- partly because of how I implemented them (`syntax-rules` rather than `syntax-parse` or `syntax-case`), and partly, with the latter, a bit less contrived declarative would've been more flexible yet looked about the same.

Another DSL, I might be the only one who likes it, but I really wanted to make it as part of rethinking Web development a bit, and you can see that I used the DSL only where I got benefit (moving some trivial computation and checking to syntax expansion time), and I expressly (see "By design...") avoided doing things like inventing my own declarative iterators, or reinventing a half-butted Scheme. There are some static checking things that I can't do this way (e.g., full HTML5 validation), but it seemed a good tradeoff, and I could always *layer* that crazy static checking later, if I really wanted to do things like make declarative language for mapping database results.  One DSL decision I made was to sacrifice the S-expression representation as data accessible to the programmer, in favor of emphasizing writing the byte stream as you go (yes, I've seen this get massive, in practice), and also using normal Racket ports, so that it could be combined with other Racket ways, for flexibility (again, not reinventing or restricting the language when it didn't benefit me). https://www.neilvandyke.org/racket/html-template/

BTW, related, a few places in the list archives, I talk about an alternative to configuration files, like thinking of the application instead as a framework, and the configuration file is actually an instantiation of the framework.  And some simple practical startup mechanics for doing that (e.g., executable that falls back to the default instantiation if no config file available, and maybe writes a "config file").  You don't have to do all that way, but you see how this could be powerful.  If you do it right, in a lightweight (in the developer burden sense) way, and, together with other factors, you could also encourage an ecosystem and culture of very casual extension of your application (like was part of what made Emacs so loved and powerful).

--
You received this message because you are subscribed to the Google Groups "Racket 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to