World: r3wp
[Core] Discuss core issues
older newer | first last |
BrianH 28-Feb-2010 [15952x2] | >> apply :now array 20 == 28-Feb-2010/7:21:53-6:00 |
USE is a mezzanine in R3, a native in R2. They made the behavior of R2's USE into a function datatype: closure!. And then Ladislav and I backported closure! to R2 as a fake datatype (though USE doesn't use it). | |
ChristianE 28-Feb-2010 [15954] | Hm, I'm wondering if it would be useful if the position of the block provided could be changed to after the last argument consumed? That would allow applying one block to more than one function. |
BrianH 28-Feb-2010 [15955] | The reference to the block provided is passed by value, not by name. You can't change the position of it, since position is a attribute of the block reference, not the block itself. |
ChristianE 28-Feb-2010 [15956] | since position is a attribute of the block reference, not the block itself - that wasn't something I knew already ... |
BrianH 28-Feb-2010 [15957x3] | However, that doesn't mean you can't advance the position yourself. Use LENGTH? WORDS-OF function to get the amount to advance, and be sure to reduce the block yourself and use APPLY/only so that the result is what you want. |
Yeah, the position being an attribute of the reference is one of the core parts of series behavior in REBOL. In contrast, in R3 ports the position is an attribute of the port, not the reference to the port; same with OPEN/direct ports in R2. | |
This means that SKIP is a pure function for series, returning a reference to a new position - while it is modifying when applied to ports, changing the internal position. Same with the other position functions like AT, HEAD and TAIL. | |
ChristianE 28-Feb-2010 [15960] | I know such things when writing code, but more in a subconcious way. Of course different references to the same block having different positions doesn't go together with position being an attribute of the block (series) itself. That's of course obvious after only a little amount of thinking ;-) |
Steeve 28-Feb-2010 [15961] | Wow ! I didn't noticed USE was not native anymore in R3... |
Andreas 28-Feb-2010 [15962] | Also, USE is broken in R3 in as it captures RETURN and EXIT. See bug#539. |
Steeve 28-Feb-2010 [15963x2] | Because USE make and do a closure! in R3 (which is a function). Don't like that :-) |
Look that alternate implementation of USE: >> use2: funco [vars body][foreach :vars vars body] >> use2 [a b][a: 1 b: 2 b + a] == 3 The funny trick is that although the [a b] vars are locals to the block, we can pass values from the encompassing context. >> a: 5 == 5 >> use2 [a][a: 1 + get a] == 6 >> a == 5 | |
BrianH 1-Mar-2010 [15965x2] | USE is not broken because it uses closure!, it's broken because R3 functions don't support something like the [throw] attribute yet. |
Note the "yet" - that's intended to be fixed. | |
Geomol 1-Mar-2010 [15967x2] | ZERO?, TRUE? and coercion. I can't really deside what to think about these examples: >> zero? 0.0.0 == true >> 0.0.0 = 0 == false >> true? 1 == true >> 1 = true == false What do you guys think? |
As ZERO is defined in REBOL, the first example could be: >> zero? 0.0.0 == true >> 0.0.0 = zero == false | |
Henrik 1-Mar-2010 [15969] | I agree with REBOL on 'zero? vs. = 0. |
BrianH 1-Mar-2010 [15970x2] | The TRUE? function was added specifically to give that answer, what is considered truth by the conditional functions. ZERO? compares to the zero value of the datatype. |
If TRUE? compared directly to #[true] then there would be no point to the function. | |
Geomol 1-Mar-2010 [15972x2] | Yes, there would in situations, where someone wants to set a variable to the truth value of something. my-var: true? some-value |
Someone might argue, that if conditional functions can operate on almost any value, then those values would be either true or false. Does it makes sense, that such values are neither true or false? | |
BrianH 1-Mar-2010 [15974] | That is why TRUE? is there, to convert the truth value of something to a logic value. |
Geomol 1-Mar-2010 [15975] | >> "hey" = true == false >> "hey" = false == false >> if "hey" [print {"hey" is true}] hey is true |
BrianH 1-Mar-2010 [15976x3] | It does make sense to have conditionals work on more than just logic values. Whether or not to do so is arbitrary, and many languages do so (mostly the Lisp-derived languages). It's one of the two main models. |
The Pascal-derived languages only use logic (or boolean) values. The assembly-derived ones use 0 and non-0. Others are weirder. | |
The Icon-derived ones use success and failure - those are weird, but useful. | |
Nicolas 4-Mar-2010 [15979] | Can rebol save program state as an image? |
Rebolek 4-Mar-2010 [15980] | no. |
Henrik 4-Mar-2010 [15981] | R2 challenge: Implement a debug-function that uses a call-stack. I made this context: context [ action-level: 0 func-name: make block! [] set 'hint func [str] [reform [action-level: action-level + 1 ":" str]] set 'doing func [name] [print hint join "Doing " last append func-name name] set 'done does [print join "Done with " first name: back tail func-name remove name action-level: action-level - 1] set 'last-hint does [print mold func-name] ] And I use it like this: my-func: func [] [ doing 'my-func ...stuff... done ] What would it take to build a function that does this automatically, like: my-func: debug-func [] [ ... stuff ... ] and also automatically catches all exits, returns and throws and allows the function to return a value? As this is built into R3, this is only for R2. |
Andreas 4-Mar-2010 [15982x3] | debug-func: function [name spec body] [b] [b: copy body insert b compose [doing (name)] append b [done] tfunc spec b] |
ah, that was premature :) | |
reminder to self: should not draft code in the altme message area :) | |
Henrik 4-Mar-2010 [15985] | well, it's a start. keep going :-) |
Andreas 4-Mar-2010 [15986] | but ladislav's tfunc should help with most of the tough issues :) |
Henrik 4-Mar-2010 [15987x2] | I'm not sure it's entirely simple. I would like it to work with the above context. The point is also that when you don't want debugging to work, you can insert a line: debug-func: :func |
I've not studied that one.... | |
Andreas 4-Mar-2010 [15989] | if you want to pass the name to doing, you'll have pass the name to debug-func as well, i fear. |
Henrik 4-Mar-2010 [15990] | then I guess I can't entirely do a debug-func: :func. that's OK as long as there will be a method to not produce much overhead for production code. |
Andreas 4-Mar-2010 [15991] | debug-func: func [name spec body] [make function! spec body] should be fine, or something similar |
Henrik 4-Mar-2010 [15992] | yes, then manipulate the body to contain DOING and DONE at the right spots. |
Andreas 4-Mar-2010 [15993] | i meant for the disabling case, now :) |
Henrik 4-Mar-2010 [15994] | well, that'll do too :-) |
Gabriele 5-Mar-2010 [15995x3] | there is a trick to get the function name, if you don't mind the overhead. |
>> f: has [err] [err: disarm try [1 / 0] print ["My name is" err/where]] >> f My name is f | |
I was using this in a profiler I did which just replaced FUNC and did something like Henrik wants above. It did however create problems with more complex REBOL scripts, eg. it made the PDF Maker 2 blow up. I never spent the time to figure out why. | |
Henrik 5-Mar-2010 [15998] | it's probably better to not try to find the name during runtime, but simply create the debug-func function as above. With that in mind, it's necessary to ask how pervasive this functionality has to be. I don't mind that it's only useful for 'func. |
Gabriele 5-Mar-2010 [15999x2] | Of note, as it may not be clear from the above, it's not the error trick that created problem, but the replacement of FUNC with my own profiling and stack tracking version. |
it may be safer if you use a different name though. i don't think i was supporting catch and throw though. | |
Henrik 5-Mar-2010 [16001] | yes, agree |
older newer | first last |