Typically there are two ways that our programs can ingest values:
* statically, via imports
* dynamically, via reading values
Why not ingest all values via imported code? If the import system is sufficiently lightweight this is simpler and easier than reading values the traditional way, plus you can read in things that are not plain values (like functions and types)
In that sense, reading/downloading text and parsing it becomes an implementation detail of the compiler and from the programmer's point of view what you're left with is a network of pure functions that can refer to each other across impure boundaries
I want to focus on connecting pure code together without thinking about the details of how that happens. I want this for the same reason that I don't want to think about manually allocating registers, managing memory, or caring about evaluation order
Also, like I mentioned, traditional I/O can't import functions or types, so this is strictly more powerful
* Resolve all imports (transitively, if necessary)
* Type-check the code
* Normalize the code (a.k.a. evaluation, but it can normalize functions, too)
It's a little more complex than that (for example, imported code is itself type-checked before substitution into the syntax tree), but that's the basic idea
It's closer in spirit to a Bash script sourcing another bash script (i.e. using "source"). However, the difference from Bash is that:
* In Bash the unit of code composition is statements (as opposed to expressions in Dhall) * When you source another script you can only do so at the top-level of the program, as a statement (as opposed to Dhall where you can import other expressions anywhere within the syntax tree)
I'm less familiar with PHP so perhaps somebody who knows it better can explain how Dhall relates to the PHP model
https://www.tcl.tk/software/plugin/safetcl.html
Minus the type safety, functional approach, etc...but similar in purpose.
However, I think the more important thing I'm trying to fix is how we compose code. The Rube-Goldberg machine the post refers to is the complicated mechanisms we have to deal with for combining code fragments. Reading in a value shouldn't be any different from reading in code and shouldn't require any more overhead than just copy-and-pasting a URL into your program