Redefining system words - gotchas
[1/13] from: tim-johnsons:web at: 26-Apr-2007 14:01
Howdy:
Here's an example:
I want to redefine 'pick so that pick series -1 gets the last element
pick series -2 gets the second to last etc...
If the source for my redefined 'pick is in a file, let's call it std.r
and we have the following code:
sys-pick: get in system/words 'pick
Now if 'sys-pick is in my code for the redefined 'pick and
I do %std.r a second time before closing the interpreter, I will
get a stack overflow because on the second 'do 'pick is already
redefined.
The workaround for this is:
if not value? 'sys-pick[
sys-pick: get in system/words 'pick
]
the works, but the gotcha is that if I'm working with a large application
that has somehow previous defined 'sys-pick errors could be introduced.
This scenario is not likely, especially if one sticks to a strict taxonomic
convention of redefining system words as 'sys-word, but I'd welcome
comments on this situation.
thanks
tim
Long live the mailing list :-)
--
Tim Johnson <tim-johnsons-web.com>
Palmer, Alaska, USA
[2/13] from: gregg::pointillistic::com at: 26-Apr-2007 17:03
Hi Tim,
TJ> I want to redefine 'pick so that pick series -1 gets the last
TJ> element pick series -2 gets the second to last etc...
TJ> ...the gotcha is that if I'm working with a large application that
TJ> has somehow previous defined 'sys-pick errors could be introduced.
I've become leery of redefining system words at a global level,
especially in larger projects, but I know that's part of the appeal of
REBOL; so I would suggest using Ladislav's INCLUDE function, that
allows you to specify that something should not be loaded if it
already has been.
-- Gregg
[3/13] from: tim-johnsons:web at: 26-Apr-2007 16:16
On Thursday 26 April 2007 23:03, Gregg Irwin wrote:
errors could be introduced.
> I've become leery of redefining system words at a global level,
> especially in larger projects, but I know that's part of the appeal of
> REBOL; so I would suggest using Ladislav's INCLUDE function, that
> allows you to specify that something should not be loaded if it
> already has been.
Hi Greg:
I've already got that functionality:
;; -------------------------------------------------------------------
load-with-path 'file: 'do file, if not already loaded,
and not found in local folder search a block of paths.
;; -------------------------------------------------------------------
import 'word: converts 'word to %file + .r
and calls load-with-path
;; -------------------------------------------------------------------
modules {space-delimited words in string} - multiple functionality
also leverages load-with-path and has built-in debugging.
One could put a keywork into the docstring and then
I could look for a keyword in third :pick ..... that is, parse the docstring.
thanks
tim
--
Tim Johnson <tim-johnsons-web.com>
Palmer, Alaska, USA
[4/13] from: tim-johnsons::web::com at: 26-Apr-2007 16:38
Something I forgot to mention....
There's a corollary to this subject.
I have a whole lot of code that uses the word path.
Sometime - I think with REBOL/Core 2.6.2.4.2 - a native
value called 'path has been introduced.
This has sometimes raised hell with my legacy code.
>>help path ;; gives me
USAGE:
PATH value selector
DESCRIPTION:
Path selection.
PATH is an action value.
ARGUMENTS:
value -- (Type: any)
selector -- (Type: any)
Don't know any more about it. Can't find any documentation on it.
But as you can see - introducing a new word from the binary can
cause problems too...
tim
--
Tim Johnson <tim-johnsons-web.com>
Palmer, Alaska, USA
[5/13] from: anton::wilddsl::net::au at: 27-Apr-2007 16:27
Hi Tim,
Do you need 'sys-pick to point to the original ?
How about this:
if action? :pick [pick: ...]
Keep in mind the whole world of rebol code is expecting
PICK to be the built-in one.
Why not just define 'my-pick or 'tj-pick and leave poor 'pick alone ?
Anton.
[6/13] from: santilli::gabriele::gmail::com at: 27-Apr-2007 11:09
2007/4/26, Tim Johnson <tim-johnsons-web.com>:
> >>help path ;; gives me
> USAGE:
> PATH value selector
[...]
It should not be there, and if you just redefine (or UNSET) it nothing
bad should happen. (You could just UNSET it at the beginning of your
code if it's causing problems.)
HTH,
Gabriele.
[7/13] from: tim-johnsons:web at: 27-Apr-2007 7:33
On Friday 27 April 2007 06:27, Anton Rolls wrote:
> Hi Tim,
>
> Do you need 'sys-pick to point to the original ?
> How about this:
>
> if action? :pick [pick: ...]
>
> Keep in mind the whole world of rebol code is expecting
> PICK to be the built-in one.
Of course!
> Why not just define 'my-pick or 'tj-pick and leave poor 'pick alone ?
ugh! not good choices... for my taste anyway.
My question is kind of academic, for a global word, I would "pick" a
different one. My choice turned out to be
"peek".
for the sake of anyone reading the thread however, I must include that there
is much code written where system words have redefined. Where I think it is
most safe to do so is inside of a context.
thanks
tim
--
Tim Johnson <tim-johnsons-web.com>
Palmer, Alaska, USA
[8/13] from: tim-johnsons::web::com at: 27-Apr-2007 7:38
On Friday 27 April 2007 09:09, Gabriele Santilli wrote:
> 2007/4/26, Tim Johnson <tim-johnsons-web.com>:
> > >>help path ;; gives me
<<quoted lines omitted: 5>>
> bad should happen. (You could just UNSET it at the beginning of your
> code if it's causing problems.)
Hi Gabrielle:
I'm curious, are you saying that 'path isn't really a viable rebol native
function? I notice that >> native? path ;; return false
while >> native? while ;; as an example only
;; returns true
If so, how did that docstring get in there?
Asking 'cuz I think you're working directly with the binary "C" code.
Thanks
tim
--
Tim Johnson <tim-johnsons-web.com>
Palmer, Alaska, USA
[9/13] from: santilli:gabriele:gma:il at: 27-Apr-2007 18:08
2007/4/27, Tim Johnson <tim-johnsons-web.com>:
> I'm curious, are you saying that 'path isn't really a viable rebol native
> function? I notice that >> native? path ;; return false
> while >> native? while ;; as an example only
> ;; returns true
It's an action!, not a native!, that's why native? returns false. But,
the point is that it is an internal action, that is not supposed to be
used by users. It was being unset in older rebols but it is not in
newer versions. It should be safe to unset it.
> If so, how did that docstring get in there?
> Asking 'cuz I think you're working directly with the binary "C" code.
I'm not, but I can guess. I've seen some bits of C code so I know that
the docstrings are embedded in C comments; I guess Carl has a script
that extracts them and builds the rebol code that "defines" the
natives (see the other "mysterious" function called "native"). So
since the whole process is automatic, PATH is there even if it should
not. :)
Regards,
Gabriele.
[10/13] from: jblake:arsenaldigital at: 27-Apr-2007 12:46
How about "pick-next" or "pick-last"?
[11/13] from: dhsunanda:gmai:l at: 27-Apr-2007 18:57
Tim:
> This scenario is not likely, especially if one sticks to a strict taxonomic
> convention of redefining system words as 'sys-word, but I'd welcome
> comments on this situation.
> thanks
> tim
We have exactly the same situation in the CGI base for REBOL.org:
** we have a large number of CGI scripts, many of which were
written as "top level" but now are called from other scripts....So
we can never assume any given script has the sole responsibility
for initialising or terminating processes;
** we incorporate other people's code as far as possible without
having to modify the code. That means we need wrappers in some
cases to remove actions that are unsuitable for CGI scripts -- we
don't want (say) makedocpro doing a Print into the middle of our
HTML output stream.
Our solution is almost identical to yours:
do-if 'sys-pick[
sys-pick: get in system/words 'pick
]
do-if executes the block if the word is *not* defined.....So
you'll see the Library CGI code littered with 'do-if statements
rather than 'do.
It's not perfect, but it works for us.
Sunanda.
[12/13] from: tim-johnsons::web::com at: 27-Apr-2007 10:33
On Friday 27 April 2007 16:46, John Blake wrote:
> How about "pick-next" or "pick-last"?
<grin> Less typing, but verbosity lends to
self-documentation....
--
Tim Johnson <tim-johnsons-web.com>
Palmer, Alaska, USA
[13/13] from: tim-johnsons::web::com at: 27-Apr-2007 13:55
On Friday 27 April 2007 17:57, Sunanda wrote:
> Tim:
> do-if executes the block if the word is *not* defined.....So
> you'll see the Library CGI code littered with 'do-if statements
> rather than 'do.
>
> It's not perfect, but it works for us.
Hey :-)
'do-if and 'set-if should be part of my rebol 'dialect'.
thanks
tim
--
Tim Johnson <tim-johnsons-web.com>
Palmer, Alaska, USA
Notes
- Quoted lines have been omitted from some messages.
View the message alone to see the lines that have been omitted