[REBOL] Re: About Standards and Best Practices
From: rebol:techscribe at: 3-Sep-2003 9:25
Hi.
Another issue that comes to mind is name space and side effects. If a
function introduces a word that will be used within the context of that
function only, then that word should be declared local to the function
in order to avoid name clashes that may result in unexpected side effects:
f: func [ /local word] [
word: "function's local word."
]
This prevents errors that result from setting a global word to some value, then evaluating
a function that happens to set the same word locally to a different value, and then continuing
to use the global word. This is especially critical if functions are reused either by
their original author or by some unsuspecting consumer. Example:
;--- consumer's script
REBOL []
;- globally declared word
erase-harddrive-completely?: NO
;- evaluating function from a downloaded library
do %down-loaded-library ;- contains function list-directory
this-dir-contents: list-directory
.
.
.
if erase-harddrive-completely? [ erase-harddrive-completely ]
;--- end user's script
So, what's the problem? Imagine the function "borrowed" from the downloaded library looks
like this:
;--- function in downloaded library --
list-directory: func [ /interactive ] [
erase-harddrive-completely?: "No"
directory-listing: read %.
if interactive [
display-directory-listing
erase-harddrive-completely?: ask "Should I erase the hard drive completely?"
]
directory-listing
];---- end libraray function ----
Note that the user's script sets erase-harddrive-completely? to the logic! value No,
whereas the function sets the word erase-harddrive-completely? to the string! "No". The
string! "No", however, evaluates as a logic! True:
>> a: No
== false
>> if a [ print "yes" ]
== none
>> a: "No"
== "No"
>> if a [ print "yes" ]
yes
>>
Thus, the harddrive will be erased, even though the library function consumer smartly
set the erase-harddrive-completely? word to No.
If, however, the library function provider had used a /local word in his function, then
it would have not had any affect on the global word.
Take Care,
Elan