[REBOL] Re: No return Value???
From: tim:johnsons-web at: 28-Nov-2003 15:35
* Elan <[rebol--techscribe--com]> [031128 13:42]:
> Hi Tim.
>
> 1. You can use unset? to check for words that do not return values .
> >> unset? print ""
Thanks for reminding me.
> == true
> >> if unset? print "" [result: "<<unset>>"]
>
> 2. If you need to assign the return value of the tested function to some
> local word, you can use set/any to avoid an error.
>
> 3. Why doesn't print return a value? Wel;l, I suspect that is because
> the purpose of print is to display its argument. If print were to return
> a value, it would not only be displaying its argument, it would force
> the REBOL interpreter to display print's return value as well. I.e. you
> would see a combination of the printed argument and print's return value
> on the screen. Instead of
> >> print ""
>
> >>
>
> which is the expected result, for instance, you would get
>
> >> print_with_return: func [arg] [ print arg return true ]
> >> print_with_return ""
>
> == true
> >>
>
> BUT the argument to print was NOT "==true" it was "".
>
> Hope this helps.
>
> Elan
>
> Tim Johnson wrote:
>
> >Hello Rebols:
> >I've got a question:
> >I've written a function called 'fetch, which has print
> >stubs to help follow the flow control.
> >
> >If you evaluate 'print with 'fetch, no value is
> >returned.
> >
> >Can someone tell me why this is so?
> >TIA
> >tim
> >
> >(example and code follows)
> >Example:
> >
> >
> >>>do %test-fetch.r
> >>>
> >>>
> >Script: "Untitled" (none)
> >
> >
> >>>fetch 'abc
> >>>
> >>>
> >type = 'word
> >val is unset
> >returning unset words as default value
> >== none
> >
> >
> >>>fetch 'print
> >>>
> >>>
> >type = 'word
> >val is set
> >
> >The code for 'fetch and helper function 'safe-reduce
> >follows:
> >REBOL[]
> >; -------------------------------------------------------------------------------
> >make object! [
> > default-value: none
> > set 'fetch func[ {safe data retrieval. Handles any value}
> > val [any-type!]
> > /seed {set default value} /deep {If block, reduce}
> > /same {If unset return 'val}
> > /local tmp][
> > either word? val[
> > print "type = 'word"
> > either value? val[
> > print "val is set"
> > get val
> > ][
> > print "val is unset"
> > either same[
> > print "returning unset word as the word"
> > val
> > ][
> > print "returning unset words as default value"
> > default-value
> > ]
> > ]
> > ][ ; any other type but 'word
> > print ["type = " (type? val)]
> > either block? val[
> > either deep[
> > safe-reduce/deep val
> > ][
> > safe-reduce val
> > ]
> > ][
> > val
> > ]
> > ]
> > ]
> > ]
> >; -------------------------------------------------------------------------------
> >safe-reduce: function[blk[block!] {reduce block, leaving unset values}
> > /deep {reduce nested blocks} ][rblk _reduce][
> > dummy: func[val /deep][val] ; pass
> > ; below a function assignment using the prefix colon
> > _reduce: either deep[:safe-reduce][:dummy]
> > ; since 'reduce is a native value (compiled into binary)
> > ; try it first
> > either all[(not deep) (rblk: attempt[reduce blk])][
> > print "Used native 'reduce"
> > rblk
> > ][
> > print "Block with unset values, using 'safe-reduce"
> > rblk: make block! length? blk
> > foreach element blk[
> > either word? element[
> > either value? element[
> > append rblk (get element)
> > ][
> > append rblk element
> > ]
> > ][
> > either block? element[
> > append/only rblk _reduce/deep element
> > ][
> > append rblk element
> > ]
> > ]
> > ]
> > rblk
> > ]
> > ]
> >
> >
>
> --
> To unsubscribe from this list, just send an email to
> [rebol-request--rebol--com] with unsubscribe as the subject.
--
Tim Johnson <[tim--johnsons-web--com]>
http://www.alaska-internet-solutions.com