Changelog#
This page contains the (mostly) complete history of Nonstraightforward.
Nonstraightforward C9#
Note
Until Nonstraightforward C9’s core is finished, versions will use the date of the commit(s) it is assigned to.
2026.05.17#
Bootstrapped
codegen.nstrfwdusing C9, nowparser.nstrfwdis the last C8 file in the compiler
Language features#
Added classifications (not classes, class**ifications**)
classification WhyWouldYouDoThis { constructor(x, y, z) { ~/usr/bin/this/x = x; ~/usr/bin/this/y = y; ~/usr/bin/this/z = z; } public stable immutable readonly synchronous subroutine sum() { reciprocate ~/usr/bin/this/x + ~/usr/bin/this/y + ~/usr/bin/this/z; } }Added
switch/case(the closest we will get to the originalmatchuntil the end of time)switch (x) { case 0: ~/dev/stdout/write/ln("even"); terminate; case 1: ~/dev/stdout/write/ln("odd"); terminate; case 2: ~/dev/stdout/write/ln("even"); terminate; case 3: ~/dev/stdout/write/ln("odd"); terminate; case 4: ~/dev/stdout/write/ln("even"); terminate; case 5: ~/dev/stdout/write/ln("odd"); terminate; case 6: ~/dev/stdout/write/ln("even"); terminate; case 7: ~/dev/stdout/write/ln("odd"); terminate; case 8: ~/dev/stdout/write/ln("even"); terminate; case 9: ~/dev/stdout/write/ln("odd"); terminate; case 10: ~/dev/stdout/write/ln("even"); terminate; case 11: ~/dev/stdout/write/ln("odd"); terminate; case 12: ~/dev/stdout/write/ln("even"); terminate; case 13: ~/dev/stdout/write/ln("odd"); terminate; case 14: ~/dev/stdout/write/ln("even"); terminate; case 15: ~/dev/stdout/write/ln("odd"); terminate; case 16: ~/dev/stdout/write/ln("even"); terminate; case 17: ~/dev/stdout/write/ln("odd"); terminate; case 18: ~/dev/stdout/write/ln("even"); terminate; case 19: ~/dev/stdout/write/ln("odd"); terminate; case 20: ~/dev/stdout/write/ln("even"); terminate; default: ~/dev/stdout/write/ln("out of range [0, 20]"); terminate; }variablenow compiles toletinstead ofvarAdded the
typeof xandx instanceof yoperators
2026.05.16#
Got the compiler working just good enough to compile a Mandelbrot set painter
Bootstrapped part of the compiler with itself instead of C8
Caused me some pain trying to resolve things.
Added proper warning and error messages
The language doesn’t support template string literals yet, it just outputs them the exact way they came in, so
console.log(\`${~/dev/stdout}\`);results in the source beingconsole.log(\`${~/dev/stdout}\`);instead of the intendedconsole.log(\`${SYSROOT.dev.stdout}\`);
Language features#
Added boolean literals
true/affirmativeandfalse/negativeAdded object literals
Added the following operators
new xandnew x(y)await x!x,+x, and~xx[y]andx.ya ^ banda ^= ba | banda |= ba & banda &= ba || banda ||= ba && banda &&= ba ** banda **= ba ..= ba != banda !== b
Added
new.targetAdded
if(...) ...andif(...) ... else ...statementsAdded their Nonstraightforward counterparts
stipulate that the provision ... qualifiesandotherwise
Added
while(...) ...anddo ... while(...)statementsAdded the Nonstraightforward while loop
so long as the condition ... is still upholding, then do ...Added
break/terminateandcontinuestatements
Added Nonstraightforward
from module "module.js" request { imports };Added support for specifying the raw
.nstrfwdextension for a module path (it automatically gets replaced by.nstrfwd.jsin codegen)
Added
throw expr;and its Nonstraightforward formretaliate expr;Added
reciprocate expr;as a Nonstraightforward form ofreturn expr;Added
async/asynchronousandawaitAdded
~/dev/stderr/write/lnforconsole.errorAdded
~/dev/randomand~/dev/urandomas aliases forMath.random()Added
~/dev/zerowhich just returns zero
Vanity changes#
Added this site
2026.05.15#
Language features#
Added
function/subroutineAdded the following operators
a = ba += ba -= ba *= ba /= ba % banda %= ba << banda <<= ba >> banda >>= ba >>> banda >>>= ba == banda === ba >= banda <= ba .. b(Lua string concatenation operator)
2026.04.07#
Changed architecture from a horrible preprocessor to an actual compiler like TypeScript
The outputted code hopefully looks a lot better than what C8 outputs
Language features#
Added numeric, string, identifier, and array literals
Added grouping expressions
Added the following operators
-xa + ba - ba * ba / bx(y)(call)
Added block, expression, function (ES), return, and variable (ES) statements
Added
SYSROOT(the~/thing)Replaced
~/dev/scopewith~/usr/binto better match real-world POSIX
Nonstraightforward C8#
Stable release, rename from ConvolutedScript and
.cvscto Nonstraightforward and.nstrfwd
Language features#
Added interface syntax (that would later be disposed of)
public noondefault stable object structure member layout Vector2 { stable member x <= number; stable member y <= number; }That typo was always there and I’m preserving it (but it wouldn’t work if you kept the typo!)
Added three new stability specifiers
volatilehazardousbiohazard
Renamed the
______A_SFWrowwl0WKFuAOwa90ifnh____________________________________________ROOTvariable toSYSROOTsince that’s the actual name of the~thing
ConvolutedScript#
Past this point is the distant past of Nonstraightforward when it used to be
named ConvolutedScript and have the .cvsc file extension.
ConvolutedScript C7#
Language features#
Added
affirmativeandnegativeas better substitutes fortrueandfalseAdded support for
+=,-=,*=,/=,===,!==,>=, and<=Added support for the nonstraightforward
stipulate that the provision [condition] qualifiesconditional statementAdded support for the nonstraightforward
so long as the condition [cond] is still upholding, then dowhile loop
ConvolutedScript C6#
The start of the changelog
renamed from Discombobulation to ConvolutedScript
Language features#
Added multiline strings