World: r3wp
[!REBOL3-OLD1]
older newer | first last |
Henrik 20-Dec-2006 [1745] | these are arithmetic operations. what about other kinds? |
JaimeVargas 20-Dec-2006 [1746] | Rebol functions can't accept a variable number of arguments with the exception of refinements. So the issue is becomes important. APPLY is kind of incompatible to the principle that * every function has a fixed number of arguments*. |
Izkata 20-Dec-2006 [1747] | They can if you take advantage of the unset! datatype... But it's not pretty and more confusing than it's worth |
Henrik 20-Dec-2006 [1748] | I just think it would be more straight forward with natives for performing arithmetics on blocks. It's more predictable. |
Maxim 20-Dec-2006 [1749] | predictable? |
Henrik 20-Dec-2006 [1750] | apply :* [] ;== 1 isn't predictable within REBOL terms, I think |
JaimeVargas 20-Dec-2006 [1751x2] | APPLY just means run this function with the block content as args. So: APPLY :+ [1 2 3 4] is equivalent to DO [+ 1 2 3 4] ;; using scheme semantics |
If we stick with this definition an no varargs for functions then APPLY :+ [1 2 3 4] is impossible it actually should throw an error because the native '+ requires two arguments. | |
Maxim 20-Dec-2006 [1753] | yes Jaime that is how I see it in REBOL too... so in rebol the last two args would be ignored if we use the current understanding |
JaimeVargas 20-Dec-2006 [1754] | In which case APPLY with math ops is kind of lame compared to scheme. |
Maxim 20-Dec-2006 [1755x2] | how does scheme understand to continue grabbing values? because its not hitting an action? |
or because it servers args within an argument () ? | |
JaimeVargas 20-Dec-2006 [1757x3] | I APPLY was simply implemented as the DO translation; you will get tons of side effects. Because, APPLY :+ [1 2 3 4] implented as DO [+ 1 2 3 4] ;== 4 (NOT 10 wich is the expected result). |
Because in Scheme you can have function with variable number of arguments thanks to the parenthetical notation. (APPLY + '(1 2 3 4)) ;== (+ 1 2 3 4) and '+ is coded to handle variable arguments. | |
In scheme the parenthesis tell the function where the expression ends. In rebol the number of arguments tell the function where the expression ends. This is a very fundamental difference and the tradoff made when dropping parenthesis or any kind of expression delimiter. | |
Maxim 20-Dec-2006 [1760x2] | exactly. |
but we can just implement our functions with a single block argument if we wish... then its a moot point... no? | |
JaimeVargas 20-Dec-2006 [1762x2] | No. Because now you need to be passing blocks everyware. And doing composing for symbol to value replacement everyware. |
For example: 1 + 2 becomes + [1 2], and then how you handle + [a b]. You need a prebinde code. Basically that reitroduces parens. | |
Maxim 20-Dec-2006 [1764x5] | yes obviously, actually calling reduce all the time. |
I've often wondered if I missed variable args, and it seems I don't miss them that mutch. they seem less needed in rebol. | |
but refinements are hard to reapply. | |
which is why I then use blocks as above. | |
I guess it could be nice if the burden of calling reduce where on the function itself. | |
JaimeVargas 20-Dec-2006 [1769] | I actually like the ability of having variable args. It is very handy. |
Maxim 20-Dec-2006 [1770x3] | in the example of a function which accepts one variable length block, it could cause the prebind (reduce) itself as a pre-entry operation. |
in this case it would allow a parens-like calling method, but we'd use blocks and the caller would not need to reduce the value explicitely. | |
obviously, the function args spec would have to be expanded a little. | |
JaimeVargas 20-Dec-2006 [1773x4] | (apply * (map + item-order-list item-price-list)) for example (apply * (map + '(1 2 4) '(100 50 25))) ;== 300 That is my one line scheme code for totalizing an order. |
But if function pre-bind blocks or pre-reduce, you lose CODE-AS-DATA, beside making function evaluation slower. | |
I used such technique in my toy implementation for supporting multimethod . (Found in rebol.org) | |
BTW. The totalizing onliner above have '* and '+ switch. Damm dyslexia. | |
Maxim 20-Dec-2006 [1777] | but that step is inevitable at some point even if we added parens. because of the way REBOL does its binding no? |
JaimeVargas 20-Dec-2006 [1778x2] | It could be replace if for example SPACE was use as delimiter. |
Or maybe a single DOT | |
Maxim 20-Dec-2006 [1780x2] | or.... an yet unused char !!!! a simple comma. |
but then we get code like C with line terminations ... yuk. | |
JaimeVargas 20-Dec-2006 [1782x4] | Exactly. The curses of *free form*. |
I actually think BLANKSPACE is a good candidate. | |
But thinks like append "d" copy skip "cba" 2. Need to be written in multiple lines. | |
APPEND "d" \ COPY \ SKIP "cba" 2 Using the '\ as hint that the expression is expecion something to return from the next expresion. | |
Maxim 20-Dec-2006 [1786] | you are tooo scheme infected. |
JaimeVargas 20-Dec-2006 [1787] | Nah. You alwasy do tradeoffs in Language Design. |
Maxim 20-Dec-2006 [1788x3] | ;-) for my part... REBOL's code looks are a reason I like it. |
one reason I'm not attracted to what I've read of scheme is the actual syntax. | |
hehe | |
JaimeVargas 20-Dec-2006 [1791x2] | Actually scheme is pretty much free form; after using it for a while you no longer see the parens. Python removed the parens but forcing identation. Acutally there is a scheme mode that allow you to program without parens. |
But the issues of expression determination is faced by every language. C uses Semicolons,, Scheme uses Pares, Unix Shell use Pipe and others; and Rebol argument counting. This simple principle will determine what kind of expressions are possible and what you gain and what you lose. | |
Maxim 20-Dec-2006 [1793x2] | but I think just using the \ char should be enough each \ ends one var arg counter. |
lifo ordering of arg "grabbing" should be able to determine which \ ends which func... AFAICT | |
older newer | first last |