A discussion branch off of
SummaryOfHofExamples
[Perhaps,
if parallelism is all we need in the application. What happens when we find we can use an
InternalIterator too? Maybe an
EmbeddedDomainSpecificLanguage or two? Event handlers? An algorithm we need to inject customisation into? What happens when we need all of those things, yet we only know about a "parallel" block construct? -
DavidMcLean]
What if Lisp-speaking aliens land all around us? I'd have to study specific scenarios on a case-by-case basis and weigh it against the alternatives. If I actually see
common uses for such in my niche, I'll consider it. So far, not. (The issue of requirements frequency keeps popping up in these debates.) For example, a task- or department-specific API is often used rather than an
EmbeddedDomainSpecificLanguage. A full
EmbeddedDomainSpecificLanguage is generally only justified if it's to be heavily used, in which case a expert on
EmbeddedDomainSpecificLanguage is usually brought in.
[I'm not sure you're clear on what an
EmbeddedDomainSpecificLanguage is, if you're drawing a distinction between one and a "task- or department-specific API". The average
EmbeddedDomainSpecificLanguage is
exactly a task-specific API; it's just one that happens to gear the language's existing syntax to the domain. Take a look at RSpec, Rake, or Sinatra for illustrative and popular
RubyLanguage examples - or their JS equivalents, if you prefer (Mocha, Jake, and Express, respectively). You don't need a special
EmbeddedDomainSpecificLanguage expert any more than you need to bring in an expert for every other library and package your solution requires. As for the rest of your response, as I implied above your argument relies on the assumption that we only need parallelism, and even more specifically that we only need
one specific kind of parallelism. It's exceedingly easy to run up against the limits of such a restricted construct; trivially, suppose we suddenly needed the ability to query in serial, such as to access a
ControlTable and dispatch on the result. In addition, again, you're spending complexity on one very specific use instead of a general tool that solves a wide range of problems - even if we only need that one kind of parallelism, what if we have events? Do we introduce a whole separate language construct for binding event handlers? Why encourage
LanguageIdiomClutter when we could just as easily use the same construct for both needs? -
DavidMcLean]
That's essentially
SystemsSoftware, which I've already agreed can probably make better use of HOF's. And sometimes
LanguageIdiomClutter seems to work better in the field; I don't know why, it's just the way typical humans are. See
GreatLispWar.
[
What's essentially
SystemsSoftware? I mentioned a bunch of things. Resolve your pronouns. -
DavidMcLean]
Writing new languages or API's intended for a wide audience or audience outside one organization is generally
SystemsSoftware: tools used BY application developers. It's generally not worth it to make a custom language for a small audience; API's and "helper functions" are sufficient and don't require hiring language specialists. And if you wish to flesh out more examples, please do, but remember this is a summary page.
[Seems perfectly reasonable, but I don't mean to claim you'd necessarily want to
write an
EmbeddedDomainSpecificLanguage, nor any complete libraries, specifically for your application. All that I suggest, and all that the examples I provided demonstrate, is that you might want to
use an
EmbeddedDomainSpecificLanguage as part of your application. Sinatra and Express are helpful for writing Web apps. RSpec and Mocha help you write unit tests. Rake and Jake help you write build tasks. All those things can be of use in an application. (Of course, if your application surpasses a certain level of complexity, it
might become valuable to start building elaborate libraries and even the occasional
EmbeddedDomainSpecificLanguage to keep the code flexible and generally compact. But it also might not; it's far more likely that you'd need to
use these things than
build them.) -
DavidMcLean]
BusinessRulesMetabase describes alternatives to a custom language. It caters to power-users who are not expected to be programmers, but can handle quasi-programming of business. Sometimes orgs have power-users who can program, but I've seen cases where when they move on or retire, their replacement cannot figure out their stuff. A
BusinessRulesMetabase, on the other hand, is a
more transferable interface. Again, one typically has to target a typical staff member for a given position, not an advanced one.
[A
BusinessRulesMetabase seems to be operating in a completely different field to the tools presented. Why would you want "power-users" defining your Web app's routing and request handling, or your unit tests, or build steps? Those things (with the maaaaaybe-an-exception of routing) all have no visible impact on users. -
DavidMcLean]
I thought we are talking about domain tools, not programmer tools. What do you mean by "routing and request handling" for web apps?
[We're talking about
EmbeddedDomainSpecificLanguages, but the examples I chose are for domains that do not typically concern end-users. Take a look at Sinatra or Express. They provide an
EmbeddedDomainSpecificLanguage for describing Web app routing, e.g., the code that dispatches a GET request for /some/particular/url/with/parameters/like/5 to the appropriate code for handling that request. -
DavidMcLean]
It sounds like a hybrid WCMS and programming framework. I probably couldn't evaluate such a product here and now effectively. I don't dispute that it "works", but the issue is how it compares to alternatives. Is there a particular feature of it you wish to illustrate? And are you saying HOF's make it easier on the DSL creators or users or both? -t
[Nah, Express and Sinatra aren't CMSes, just Web frameworks; they're only meant to serve as examples of
EmbeddedDomainSpecificLanguage, so nothing specific to these frameworks alone is particularly relevant. And my claim is that the use of a DSL, built with anonymous and higher-order functions, makes the API friendlier and more flexible for its users. -
DavidMcLean]