World: r3wp
[!REBOL3-OLD1]
older newer | first last |
BrianH 12-Feb-2009 [11085] | Yup. And then are they still infix? |
[unknown: 5] 12-Feb-2009 [11086x2] | I don't think so. Let me check. |
No, they are not. | |
BrianH 12-Feb-2009 [11088] | They are in R3. My guess is that R2's DO special-cased the standard op! words, while R3 goes off the op! type. |
Janko 12-Feb-2009 [11089] | BrianH: interesting discovery |
BrianH 12-Feb-2009 [11090] | I've wanted this for YEARS! |
[unknown: 5] 12-Feb-2009 [11091] | why? |
BrianH 12-Feb-2009 [11092] | General principle, mostly, but also localization or other-language emulation of operators. Plus it makes user-defined operators possible, in theory. |
[unknown: 5] 12-Feb-2009 [11093] | Yeah I have never seen a need myself but its cool none the less. Rather have a feature than not have it. |
BrianH 12-Feb-2009 [11094] | The APPLY discovery is bigger news, since that code injection trick is a real concern. |
[unknown: 5] 12-Feb-2009 [11095] | What does APPLY do? |
BrianH 12-Feb-2009 [11096] | >> help apply USAGE: APPLY func block /only DESCRIPTION: Apply a function to a reduced block of arguments. APPLY is a native value. ARGUMENTS: func -- Function to apply (any-function!) block -- Block of args, reduced first (unless /only) (block!) REFINEMENTS: /only -- Use arg values as-is, do not reduce the block |
[unknown: 5] 12-Feb-2009 [11097] | Not sure I get it. Give me an example. |
BrianH 12-Feb-2009 [11098] | APPLY is good for wrapper functions, and now for using function values. From COLLECT: output: apply :insert [output :value none none only] From USE: apply make closure! reduce [to block! vars copy/deep body] [] From ACCUMULATE: value: apply :fn [:value series/1] |
[unknown: 5] 12-Feb-2009 [11099x3] | >> a: func [b c][print b + c] == make function! [[b c][print b + c]] >> apply a [2 3] ** Script error: a is missing its c ar |
My error is because I followed the help to the letter. | |
This is why I decided not to participate in the documenation of R3 - because some of the help just doesn't make sense to me. | |
BrianH 12-Feb-2009 [11102x2] | No, your error is that you didn't pass a function, you passed the name of a function, without expecting it to evaluate. Try this: apply :a [2 3] |
Apply takes a function, not a word. The func parameter is not a 'func lit-word! parameter. | |
[unknown: 5] 12-Feb-2009 [11104x2] | But that isn't how the help stated it. If it wanted me to pass the spec to the appy function it should have said so. |
But it is still a function | |
BrianH 12-Feb-2009 [11106] | No, parameters evaluate unless they are specified with lit-words or get-words in REBOL. That is how all REBOL functions work. |
[unknown: 5] 12-Feb-2009 [11107] | Why do we need Apply? |
BrianH 12-Feb-2009 [11108] | Low-level code, special tricks, wrapper functions, safe evaluation, passing along refinements, ... |
[unknown: 5] 12-Feb-2009 [11109x2] | Ok your right Brian, the help is perfect. |
I haven't been programming in REBOL long enough to understand this stuff. | |
BrianH 12-Feb-2009 [11111x3] | I'll put in a ticket to change the help string from "Function to apply" to "Function value to apply", just in case. |
It might even be accepted :) | |
Done. | |
Janko 12-Feb-2009 [11114] | huh.... I see rebol has many intereting words that I haven't even known about what even thought what they alow me to do .. like these that you mention apply and collect |
[unknown: 5] 12-Feb-2009 [11115x2] | Brian, I'm not sure that value is a good term either - maybe others can comment. I like to say spec. As that makes more sense to me. Newbies might think value means argument. No matter how silly these things seem - not everyone that is going to learn REBOL will have a programming background. |
specification rather than spec. | |
BrianH 12-Feb-2009 [11117x3] | But you don't pass the function spec, you pass the function value. The function spec is the block with the parameters, types and doc strings. The function value is the value that gets assigned to the word that is used as the name of the function, it any. |
it -> if | |
The function value is like :add, the function spec is (in R2) third :add or (in R3) spec-of :add. >> print mold third :add [ "Returns the result of adding two values." value1 [number! pair! char! money! date! time! tuple!] value2 [number! pair! char! money! date! time! tuple!] ] | |
Janko 12-Feb-2009 [11120] | Brian .. some most certanly a crazy question ... is there a way you could walk/execute a block of code in steps ... this is probably possible (if they take no arguments) [ func-1 func-2 func-3 ] ... but is there some "magic" way to execute make func consume their arguments, like this >> b: [ print "hello" add 4 6 ]<< and >>do get-expr b 1<< would print "hello" and >>do get-expr b 2<< would calcualate 10 ... I know this is probably not even remotely possible |
BrianH 12-Feb-2009 [11121] | Yes, DO/next. But it doesn't work in R3 yet, just R2. That is a bug, btw. |
Janko 12-Feb-2009 [11122] | what is a bug? |
BrianH 12-Feb-2009 [11123] | DO/next not working in R3. It's not an intentional change. |
Janko 12-Feb-2009 [11124x2] | hm.. :) there really is do/next :)) awesome |
aha... I was scared do/next is a bug :) | |
BrianH 12-Feb-2009 [11126x2] | DO was rewritten in R3, and not all of the old behavior is implemented yet. Though there are some intentional differences. |
LOAD was rewritten too, as a mezzanine, by me. There is still some missing functionality, and some fixes to bugs in R2's LOAD. | |
Janko 12-Feb-2009 [11128] | I am trying the do/next .. I can execute first expression but then I am a little lost of what to *do next* ( hehe)... >> b: copy [ empty? "" empty? "a" ] do/next b == [true [empty " "]] << I tried >> b: next do/next b << |
BrianH 12-Feb-2009 [11129x2] | set/any [value code] do/next code |
'value gets set to the result of the first evaluation, 'code gets set to the code block at the position after the first expression. | |
Janko 12-Feb-2009 [11131x2] | aha, that's why it says it returns two things in help |
so code is a code block and value is something that has a result that code block would return if I do it at the end ? | |
BrianH 12-Feb-2009 [11133] | >> do/next [1 + 1 2 + 2] == [2 [2 + 2]] That last block is an offset reference to the original code block. |
Janko 12-Feb-2009 [11134] | it works here too.. one strange thing is that at the last do/next I get right value for the end of the block and if I do/next again that value get's unset (I didn't know that is even possible) >>>value ** Script Error: value has no value ** Near: value<<< |
older newer | first last |