However - and not because I'm the author of the language - once you get the general idea of Arturo (or any of the languages of the Rebol family: be it Rebol, Red, or Arturo), I assure you that you will find it very tempting not to ever go back to the C-inspired languages.
If I could sum up the whole (not-so-)syntax of Arturo, I would say that every "command" takes takes the necessary parameters on its right. And that's pretty much it.
print 10 ; that's a valid function call for example
or
print add 1 2 ; that's also a valid function call (or 2, to be precise)
and...
a: 1 + 2 ; that's how you "assign" meaning to a symbol
other than these super-basics, having a look into the library is pretty much all you'll need in order to get started.
I guess this isn't that difficult. :)
P.S. Feel free to ask any question you want. Feedback and input of any kind is more than welcome too. Also, our Discord channel is fairly active, so... I would even invite you there, so that we could actually exchange ideas about it in a more... interactive way.
Thanks a lot for your kind words. I really appreciate it! :)
Regarding "?"-functions.
Yes, the idea was this: to separate "normal" functions (that is, functions returning something or altering a value in-place) from functions returning a boolean values - let's call them predicates. That's not a rule, it's merely by convention (at least in the built-in library).
Re: "if" vs "if?", as I said before... the second one is a predicate, meaning: it does return a boolean value (that of the passed condition parameter). And the main use is... chaining with an "else". ;-)
I've done my best. As for the inspiration, as I've said before, although the two languages (or the 3 of them, if I include Red) did end up looking quite similar, when I started out I had no knowledge of Rebol (other than the name). So, basically, I designed something from scratch, with its own characteristics. Now, given that, afterwards I sure have studied Rebol/Red a lot, and I must admit that both have served as an interesting source of ideas as well.
Looking forward to your feedback once you play a bit with it! :)
No offence taken. I guess this (quite common) question could go for a wide variety of things... but then, many things would have been left without been invented or even tried. Now, to try to properly answer your question: I guess the simple answer was that I couldn't find what was I was looking for - in a language, in this case. So, I decided to create it myself. :)
Thanks a lot for your kind words! I've worked very hard on it - both the language and the website - so, I definitely appreciate it. Feel free to join the community and let me know in case you have any questions whatsoever! :)
Regarding if returning a value - and thus, being able to use it as part of an expression - is an absolutely interesting idea I've been thinking of implementing. However, I still don't know how.
One idea would be to add an .attribute, e.g. if.get - and then have it return a value.
Or, use a different function altogether.
But then we'd have, 3-4 if's. That sounds like a bit of an overkill, I admit.
Basically, the idea behind "?" is "functions that return a boolean". But done in a consistent way. So, practically EVERY function that returns a boolean is - by convention - terminated with a "?".
Now, why the two "if"s:
Obviously, as you yourself mentioned, 'if? returns a boolean (the result of the condition) and 'if doesn't.
So that's one use.
The next use - which I will obviously have to make crystal clear in the Language Reference - is that if? (with the ?) is a must if you want to pair with an "else".
Think of it this way. If?-else may appear as a language construct, but in fact they are two separate commands. The if? is an if - that pushes the result of the condition of the stack. And "else" is actually a reversed-if: it checks what is at the top of the stack (see: returned by the if? above) and if that is false - that is: the above if-condition was not true - it executes its block.
So, in that case, you have to use an "if?" (and not a simple "if")
The same thing happens with a case/when? construct (only, in that case, the condition blocks are actually concatenated),e .g.
case [x]
when? [<3] [print "it was less than 3"]
when? [=3] [print "it was equal to 3"]
else [ print "it was greater than 3"]
Long answer: Arturo's aim is to be able to run, easily and effortlessly, on anything you can imagine.
Right now, it supports macOS, Linux, Windows, Raspberry (ARM-based Linux), FreeBSD + Web/JS.
Windows support may leave a tiny bit to be desired, but that's exactly what I'm here for: to make Arturo better. And better.
Looking forward to your feedback! :)