Hi list,

[Warning: long post]

Although debugging in REBOL stays simple (think about '?, '?? and other probe), we had 
the need to add some functionalities to it for our project developments.
I did hack in this 'debug function this morning, which is pretty simple to use and did 
help us to debug a long script in the afternoon.
One of the big advantage is that the debugging instructions do not interfear with the 
normal evaluation of the script.

Given the simplistic script:

;=== begin script ======================
rebol []

;$debug
a: 1
;$debug
b: 2
a: "test"
;$debug/stop
v: 10
;$debug/var 'a

ask "done"
;=== end script ======================

the 'debug output will be:

;=== begin output ======================
--- DEBUG CALL # 1 at 14-Nov-2003/15:33:13+1:00 ---
No user word defined

--- DEBUG CALL # 2 at 14-Nov-2003/15:33:13+1:00 ---
A is an integer of value: 1

--- DEBUG CALL # 3 at 14-Nov-2003/15:33:13+1:00 ---
A is a string of value: "test"
B is an integer of value: 2
- Pause requested - Press any key to continue ...

--- DEBUG CALL # 4 at 14-Nov-2003/15:33:16+1:00 ---
A is a string of value: "test"
done
;=== end output ======================


Here is the 'debug script. The "special" coding style has been developped by us to 
make possible the utilisation of an style-checker, wich enforce the standardisation of 
the script produced within out projects. So don't pay too much attention to it ;)

;=== begin script ===================== 
rebol [
    title: "Debug"
    purpose: "provide an easy way to examine user word contents"
    history: [
        0.1.2 [14-nov-03 "initial" "cou"]
    ]    
    usage: {
        1. your script...
            at the place you want a examination of word content:
            ;$debug           => gives value of all user words
            ;$debug/var 'var1 => gives only value of var1
            ;$debug/var [var1 var2] => gives only value of var1 & var2
            ;$debug/stop => request pause after displaying var value
        2. calling the debug script...
            from the console:  
            do/args %debug.r %yourscript.r
                        or
            do %debug.r   => the file to debug will be requested     
    }
]

debug_ctx: context [
    
    do [
        pri_debug_count: 0
    ]   
        
    ;---------------------------------------------------------------------------
    set 'debug func [
        {=== TASK X.X === [COU]
         print value of the choosen user words (all by default)
         RETURN: true = all OK / false = error}
        /var aany_var [word! block!] "word or block of words to get value for"
        /stop "pause after each debug call"
        /local lerr_result
    ][
        either error? lerr_result: try [
            print [newline "--- DEBUG CALL #" pri_debug_count: pri_debug_count + 1 
"at" now "---"]
            either var [                
                either word? aany_var [
                    either find query system/words :aany_var [
                        help :aany_var
                    ][
                        print [aany_var "is undefined"]
                    ]                    
                ][
                    foreach ew_user sort aany_var [
                        either find query system/words :ew_user [
                            help :ew_user
                        ][
                            print [ew_user "is undefined"]
                        ]
                        
                    ]
                ]
            ][
                either [pri_debug_count] = query system/words [
                    print "No user word defined"
                ][
                    foreach ew_user sort query system/words [   
                        if all [
                            :ew_user <> 'type-name
                            :ew_user <> 'pri_debug_count
                        ] [
                            help :ew_user
                        ]                        
                    ]
                ]                
            ]
            
            if stop [ask "- Pause requested - Press any key to continue ..."]
            
        ][  ;--- error handling
            probe disarm lerr_result
            return false
        ][  ;--- return if all ok
            return true
        ]
    ]
    
    do [
        either prs_arg: system/script/args [
            prfile_arg: to-rebol-file prs_arg
            prs_to_debug: replace/all read prfile_arg ";$debug" "debug"
            query/clear system/words            
            do load prs_to_debug
        ][
            if not prfile_arg: request-file/title/filter "Select file to debug" 
"Select" "*.r" [quit]
            prfile_arg: first prfile_arg
            prs_to_debug: replace/all read prfile_arg ";$debug" "debug"
            query/clear system/words
            do load prs_to_debug
        ]
        print "----------------------------------------"
        ask "End of script. Press any key to quit ..."
    ]
]
;=== end script =======================

Hopes this can be usefull to someone.
Anyway, do not hesitate to criticise or give remark about it ;)

==christophe

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

Reply via email to