mirror of
https://github.com/Reuh/anselme.git
synced 2025-10-27 16:49:31 +00:00
105 lines
4.8 KiB
Text
105 lines
4.8 KiB
Text
# Symbol selection
|
|
|
|
Anselme favor symbols over keywords, as it make translation easier.
|
|
|
|
We prefer to use symbols available on a standard US keyboard as it often is the lowest common denominator.
|
|
|
|
As we want to be able to write identifiers with little restriction, we try to only use symbols which are unlikely to appear naturally in a name.
|
|
|
|
Considering Anselme is aimed to people with a light programming introduction, are safe to use for syntax purposes:
|
|
|
|
* Diacritics (should be safe when used on their own): ~`^
|
|
* Usual mathematical symbols (should be safe to use): +-=<>/
|
|
* Unusual punctuation / main use is already programming (should be safe to use): []*{}|\_
|
|
* Usual punctuation used to separate parts of a sentence (should be safe to use): !?.,;:()
|
|
* Signs (could be used in a name, but also common programming symbols): @&$#%
|
|
* Usual punctuation (could be used in a name): '"
|
|
|
|
In the end, we decided to reserve all of those except '.
|
|
|
|
Using other unicode symbols may be also alright, but there also should be a way to only use these symbols.
|
|
|
|
TODO: add alias to §
|
|
|
|
Reserved symbols that are still not used in expressions: `\_?@$
|
|
|
|
Reserved symbols that are still not used as a line type: `^+-=</[]*{}|\_!?.,;)"&%
|
|
|
|
# Code Q&A
|
|
|
|
* What does "fqm" means?
|
|
It means "fully qualified matriname", which is the same as a fully qualified name, but considers the hierarchy to be mostly mother-daugher based.
|
|
It has nothing to do with the fact I'm inept at writing acronyms and realized I wrote it wrong after using it for a whole year.
|
|
* Why are built-in anselme scripts stored in Lua files?
|
|
I believe it was to avoid reimplementing the require() file search algorithm myself.
|
|
* What's a "variant"?
|
|
One of the different forms of a same function with a given fqm. No idea why I chose "variant".
|
|
* Why emojis?
|
|
They're kinda language independent I guess. I have no idea.
|
|
* Why?
|
|
I still have no idea.
|
|
|
|
# Other
|
|
|
|
Broad goals and ideas that may never be implemented. Mostly used as personal post-it notes.
|
|
|
|
TODO: rewrite cycle, ... using function references
|
|
|
|
TODO: consider something like :identifier to create a string "identifier", might simplify the identifier=value special syntax and free up the = operator
|
|
|
|
TODO: some sensible way to capture text event in string litterals (string interpolation)? -> meh, this means we can capture choice events, and choice events contain their code block, and we don't want to store code blocks in the save file (as code can be updated/translated/whatever)
|
|
|
|
TODO: the function decorator feels a bit glued-on to the current syntax
|
|
|
|
TODO: simplify language, it is much too complicated. Less line types? (var def, func, checkpoint, tag). Rewrite some ad hoc syntax using the expression system?
|
|
|
|
TODO: functions/checkpoint: separate from scoping and/or actual functions? with proper scoping & stuff
|
|
|
|
TODO: fn/checkpoint/tag: maybe consider them a regular func call that takes children as arg; can keep compatibility using $/§ as shortcut for the actual call.
|
|
would allow more flexibility esp. for tags...
|
|
a func def would be:
|
|
|
|
:a
|
|
stuff
|
|
|
|
but then args?
|
|
|
|
:a = $(args)
|
|
stuff
|
|
|
|
how are children passed on? overloading?
|
|
|
|
if not possible, at least make checkpoint or fn defined using the other or some superset... -> checkpoints defined using fn
|
|
|
|
OK for tag though: pushtag/poptag fn:
|
|
|
|
# color:red
|
|
a
|
|
|
|
translate to
|
|
|
|
~ tag.push(color:red)
|
|
a
|
|
~ tag.pop()
|
|
|
|
TODO: perform seen/reached/etc default variable not in interpreter but using parse-time macro
|
|
|
|
TODO: no function call without () (reference to fn instead?). Fn could be stored in save but replaced with new versions on code reload... -> how to track these references?
|
|
if we make fn first class this means anonymous fn, is it ok?
|
|
|
|
TODO: make language simple enough to be able to reimplement it in, say, nim. Especially the interpreter (we could precompile a lot of stuff...)
|
|
|
|
TODO: test reacheability of script paths
|
|
|
|
TODO: redisign the checkpoint system to work better when used with parallel scripts (if both change the same variable, will be overwritten)
|
|
|
|
TODO: redisign a static type checking system
|
|
If we want to go full gradual typing, it would help to:
|
|
* add type anotation+type check to variables (:a::number=5) and functions return ($ f()::number)
|
|
* enforce some restrictions on type (assume they're constant?)
|
|
* make some tuple/list distinction (homogenous/heterogenous types) as right now index operations are a type roulette. Or type annotate lists using some parametric type.
|
|
Advantages:
|
|
* can be used for better static variant selection; if everything is type annotated, selection could be restricted to a single function
|
|
Disadvantages:
|
|
* idk if it's worth the trouble
|
|
* could do something like `$ ()(l::list(?), i::number)::?`, but then can't return nil on not found...
|