the language I’m working on has a (good) name now; it was called Madisaster, but is now called Attion or \@tion, after its extensive use of the “at”/@ symbol. I’m implementing it in Python because. it’s my “native” programming language, and the only one I’m any good at lmao.
The essential feature of Attion is creative use of block scope- most forms of data in the language are derived from, or reasonably analogous to, the class representing blocks of code. Scopes are maintained in a stack, sort of. you can access the values of arbitrary scopes (like a peek operation of arbitrary depth), but the only write operation the scope stack supports is to push a scope onto the stack or pop one off of it.
Outside of the scope stack, you can store a scope in an attribute of an enclosing scope- identifiers are just attributes on scopes- and you can designate that an identifier is “unscoped” within a scope and its child scopes, meaning it’s automatically loaded in as an attribute to any inheriting scope and can be accessed by its identifier alone, unqualified by reference to any particular scope. Functions are just scopes that limit the kind of input they can take and are obliged to return a particular sort of value to the calling scope. (Do you hate the word scope yet)
Oh, yeah, and there are no singletons, only arrays of length one. So, taking integers as an example, all sorts of things you’d normally do with singleton integers (indexing, giving lengths, denoting the start/stop/step of a slice, etc.) will have defined (if bizarre) behavior if you use integer arrays with length greater than one.














