How NGLess uses its version declaration
NGLess is my metagenomics tool, which is based on a domain specific language. So, NGLess is both a language and a tool (which implements the language).
Since the beginning, ngless has had a focus on reproducibility and one the small ways in which this was implemented was that ngless requires a version declaration. Every ngless script is required to start with a version declaration:
ngless "0.5"
This was always intended to enable the language to change while keeping perfect reproducibility of past scripts. Until recently, though, this was just hypothetical.
In October, I taught a course on NGLess and it became clear that one of the minor inconsistencies in the previous version of the language (at the time, version "0.0") was indeed confusing. In the previous version of the language, the preprocess
function modified its arguments. No other function did this.
In version "0.5" (which was released on November 1st), preprocess
is now a pure function, so that you must assign its output to a value.
However, and this is where the version declaration comes into play, the newer executable still accepts scripts with the version declaration ngless "0.0"
. Furthermore, if you declare your script as using ngless 0.0, then the old behaviour is used. Thus, we fixed the language, but nobody needs to update their scripts.
Implementation note (which shouldn't concern the user, but may be interesting to others): before interpretation, ngless will transform the input script, adding checks and optimizing it. A new pass (which is only enabled is the user requested version "0.0"), simply transforms the older code into its newer counterpart. Then, the rest of the process proceeds as if the user had typed in the newer version.