That's very interesting!
As this code shows, however, the "return:" has
not been used in any global functions as yet:

foreach word first system/words [
        if all [
                v: attempt [get in system/words word]
                function? :v
                find third :v first [return:]
        ][print [word mold third :v]]
]
;== none

Anton.

> Hi All,
>
> while looking into the vim syntx file for rebol, I thought ... "Wouldn't
> it be nice to autogenerate this?".
>
> But to do this efficiently, I need some more info within the function, so
> I started to look at 'help and was amazed to find the following
> code snippets:
>
>      if rtype [print ["^/RETURNS:^/^-" rtype]]
>
> and
>
>     all [set-word? :item :item = first [return:] block? first args
>       rtype: first args]
>
> Well, this is the result of what happened later ;-)
>
>  >> help help
> USAGE:
>      HELP 'word
>
> DESCRIPTION:
>       Prints information about words and values.
>      *PATCHED* iho
>      Returns additional info on functions
>
>       HELP is a function value.
>
> ARGUMENTS:
>       word -- (Type: any-type)
>
> RETURNS:
>       does not return a value
>
> CATEGORIES:
>       help
>
>
> Any comments appreciated!
>
> Ingo
>
>
>
> -- Attached file included as plaintext by Ecartis --
> -- File: help-system.r
>
> REBOL [
>    Title: "Help Patch"
>    Author: "Ingo Hohmann"
>    Version: 0.0.1
>    File: %help-system.r
>
>       library: [
>       level: 'intermediate
>       platform: 'all
>       type: [ tool patch ]
>       domain: [patch]
>       tested-under: [view linux]
>       support: none
>       license: none
>       ]
>
>    TODO: {
>       add todo and date fields?
>    }
> ]
>
>
>
> func: func [
>     {Defines a user function with given spec and body.
>     *PATCHED* iho
>     Allows in the spec the following additional info:
>       return: [list of types]
>       category: [list of categories]
>       author: [author info]
>     these additiona are purely informational
> }
>     [catch]
>     spec [block!] {Help string (opt) followed by arg words (and
> opt type and string)}
>     body [block!] "The body block of the function"
>     /local returns categories author fun pos
> ][
>    if all [pos: find spec first [return:] block? next pos] [
>       returns: pos/2
>       remove/part pos 2
>    ]
>    if all [pos: find spec first [category:] block? next pos] [
>       categories: pos/2
>       remove/part pos 2
>    ]
>    if all [pos: find spec first [author:] block? next pos] [
>       author: pos/2
>       remove/part pos 2
>    ]
>
>    fun: throw-on-error [make function! spec body]
>
>    pos: any [find third :fun /local tail third :fun ]
>
>    if returns [insert pos compose/only [return: (returns)]]
>    if categories [insert pos compose/only [category: (categories)]]
>    if author [insert pos compose/only [author: (author)]]
>
>    :fun
> ]
>
>
> add-function-info: func [
>    {Add additional info to an already defined function}
>    [catch]
>    :fun [function! native! action!] "The function to add info to"
>    info [block!] "block of info blocks"
>    return: [none]
>    category: [help]
>    author: ["Ingo Hohmann"]
>    /local pos
> ][
>    either parse info [
>       some [
>          set-word! block!
>       ]
>    ][
>       insert any [find third :fun /local tail third :fun] info
>    ][
>       throw make error! "info block has wrong contents"
>    ]
> ]
>
>
> add-function-info func [
>    return: [function!]
>    category: [development]
>    Author: [RT "Ingo Hohmann"]
> ]
>
> help: func [
>     {Prints information about words and values.
>     *PATCHED* iho
>     Returns additional info on functions
>     }
>     'word [any-type!]
>     return: ["Does not return a value"]
>     category: [help]
>     author: [RT "Ingo Hohmann"]
>     /local value args item name refmode types attrs rtype
> categorized author
> ][
>     if unset? get/any 'word [
>         print trim/auto {
> ^-^-^-^-To use HELP, supply a word or value as its
> ^-^-^-^-argument:
> ^-^-^-^-
> ^-^-^-^-^-help insert
> ^-^-^-^-^-help system
> ^-^-^-^-^-help system/script
>
> ^-^-^-^-To view all words that match a pattern use a
> ^-^-^-^-string or partial word:
>
> ^-^-^-^-^-help "path"
> ^-^-^-^-^-help to-
>
> ^-^-^-^-To see words with values of a specific datatype:
>
> ^-^-^-^-^-help native!
> ^-^-^-^-^-help datatype!
>
> ^-^-^-^-Word completion:
>
> ^-^-^-^-^-The command line can perform word
> ^-^-^-^-^-completion. Type a few chars and press TAB
> ^-^-^-^-^-to complete the word. If nothing happens,
> ^-^-^-^-^-there may be more than one word that
> ^-^-^-^-^-matches. Press TAB again to see choices.
>
> ^-^-^-^-^-Local filenames can also be completed.
> ^-^-^-^-^-Begin the filename with a %.
>
> ^-^-^-^-Other useful functions:
>
> ^-^-^-^-^-about - see general product info
> ^-^-^-^-^-usage - view program options
> ^-^-^-^-^-license - show terms of user license
> ^-^-^-^-^-source func - view source of a function
> ^-^-^-^-^-upgrade - updates your copy of REBOL
> ^-^-^-^-
> ^-^-^-^-More information: http://www.rebol.com/docs.html
> ^-^-^-}
>         exit
>     ]
>     if all [word? :word not value? :word] [word: mold :word]
>     if any [string? :word all [word? :word datatype? get :word]] [
>         types: dump-obj/match system/words :word
>         sort types
>         if not empty? types [
>             print ["Found these words:" newline types]
>             exit
>         ]
>         print ["No information on" word "(word has no value)"]
>         exit
>     ]
>     type-name: func [value] [
>         value: mold type? :value
>         clear back tail value
>         join either find "aeiou" first value ["an "] ["a "] value
>     ]
>     if not any [word? :word path? :word] [
>         print [mold :word "is" type-name :word]
>         exit
>     ]
>     value: either path? :word [first reduce reduce [word]] [get :word]
>     if not any-function? :value [
>         prin [uppercase mold word "is" type-name :value "of value: "]
>         print either object? value [print "" dump-obj value]
> [mold :value]
>         exit
>     ]
>     args: third :value
>     prin "USAGE:^/^-"
>     if not op? :value [prin append uppercase mold word " "]
>     while [not tail? args] [
>         item: first args
>         if :item = /local [break]
>         if any [all [any-word? :item not set-word? :item]
> refinement? :item] [
>             prin append mold :item " "
>             if op? :value [prin append uppercase mold word " "
> value: none]
>         ]
>         args: next args
>     ]
>     print ""
>     args: head args
>     value: get word
>     print "^/DESCRIPTION:"
>     either string? pick args 1 [
>         print [tab first args newline tab uppercase mold word
> "is" type-name :value "value."]
>         args: next args
>     ] [
>         print "^-(undocumented)"
>     ]
>     if block? pick args 1 [
>         attrs: first args
>         args: next args
>     ]
>     if tail? args [exit]
>     while [not tail? args] [
>         item: first args
>         args: next args
>         if :item = /local [break]
>         either not refinement? :item [
>             all [set-word? :item :item = first [return:] block?
> first args rtype: first args]
>             all [set-word? :item :item = first [category:] block?
> first args categorized: first args]
>             all [set-word? :item :item = first [author:] block?
> first args author: first args]
>             if none? refmode [
>                 print "^/ARGUMENTS:"
>                 refmode: 'args
>             ]
>         ] [
>             if refmode <> 'refs [
>                 print "^/REFINEMENTS:"
>                 refmode: 'refs
>             ]
>         ]
>         either refinement? :item [
>             prin [tab mold item]
>             if string? pick args 1 [prin [" --" first args] args:
> next args]
>             print ""
>         ] [
>             if all [any-word? :item not set-word? :item] [
>                 if refmode = 'refs [prin tab]
>                 prin [tab :item "-- "]
>                 types: if block? pick args 1 [args: next args
> first back args]
>                 if string? pick args 1 [prin [first args ""]
> args: next args]
>                 if not types [types: 'any]
>                 prin rejoin ["(Type: " types ")"]
>                 print ""
>             ]
>         ]
>     ]
>     if rtype [print ["^/RETURNS:^/^-" rtype]]
>     if categorized [print ["^/CATEGORIES:^/^-" categorized]]
>     if attrs [
>         print "^/(SPECIAL ATTRIBUTES)"
>         while [not tail? attrs] [
>             value: first attrs
>             attrs: next attrs
>             if any-word? value [
>                 prin [tab value]
>                 if string? pick attrs 1 [
>                     prin [" -- " first attrs]
>                     attrs: next attrs
>                 ]
>                 print ""
>             ]
>         ]
>     ]
>     exit
> ]

-- 
To unsubscribe from this list, just send an email to
[EMAIL PROTECTED] with unsubscribe as the subject.

Reply via email to