tisTcl
Proc.
Not logged in
namespace eval ::tis {

namespace eval tcl {

Proc procPuts.

Echoes info about a proc in the screen.

Arguments:

Returns:

Side effects:

proc procPuts {procName} {
    puts PROC($procName)ARGS([
        procSignature $procName
    ])BODY([info body $procName])
    return
}

Proc procsPuts.

Puts info about a set of procs given by a pattern. If pattern is not provided, will give info about all procs in ::tis.

Arguments:

Returns:

Side effects:

proc procsPuts {{pattern ""}} {
    if {$pattern eq ""} {
        set pattern *
    }
    foreach procName [lsort [info procs $pattern]] {
        procPuts $procName
    }
    return
}

Proc procExists.

Gives info about the existence of a proc given its name.

Arguments:

Returns:

Side effects:

proc procExists {procName} {
    return [expr {[info procs $procName] ne {}}]
}

Proc procSignature.

Get the signature associated to a procedure.

Arguments:

Returns:

Side effects:

Notes:

proc procSignature {procName} {
    if {![procExists $procName]} {
        error "proc $procName does not exist"
    }
    set signature ""
    foreach arg [info args $procName] {
        if {[info default $procName $arg def]} {
            lappend signature [list $arg $def]
        } else {
            lappend signature $arg
        }
    }
    return $signature
}

Proc procSignatureCheck.

Check that a list forms a valid signature.

Arguments:

Returns:

Side effects:

Notes:

proc procSignatureCheck {args} {
    set mode singleArg
    set result -1
    foreach arg $args {
        switch $mode {
            singleArg {
                if {[llength $arg] == 1} {
                    if {$arg eq "args"} {
                        set mode args
                    } else {
                        incr result
                    }
                } elseif {[llength $arg] == 2} {
                    set mode argWithDef
                } else {
                    error "bad arg $arg"
                }
            }
            argWithDef {
                if {[llength $arg] == 1} {
                    if {$arg eq "args"} {
                        set mode args
                    } else {
                        error "bad arg $arg after arg with default"
                    }
                } elseif {[llength $arg] == 2} {
                    # Do nothing.
                } else {
                    error "bad arg $arg after arg with default"
                }
            }
            args {
                error "bad arg $arg after args"
            }
        }
    }
    return $result
}

Proc procSignatureMapCall.

Map a signature to a call.

Arguments:

Returns:

Side effects:

proc procSignatureMapCall {signature call} {
    set mode singleArg
    set map {}
    set callIndex 0
    set callLen [llength $call]
    foreach arg $signature {
        switch $mode {
            singleArg {
                if {[llength $arg] == 1} {
                    if {$arg eq "args"} {
                        set mode args
                        if {$callIndex < $callLen} {
                            lappend map $arg [
                                lrange $call $callIndex end
                            ]
                        } elseif {$callIndex == $callLen} {
                            lappend map $arg {}
                        } else {
                            error \
                            "callIndex $callIndex out of range $callLen"
                        }
                    } else {
                        if {$callIndex < $callLen} {
                            lappend map $arg [lindex $call $callIndex]
                            incr callIndex
                        } else {
                            error \
                            "callIndex $callIndex out of range $callLen"
                        }
                    }
                } elseif {[llength $arg] == 2} {
                    set mode argWithDef
                    if {$callIndex < $callLen} {
                        lappend map [lindex $arg 0] [
                            lindex $call $callIndex
                        ]
                        incr callIndex
                    } elseif {$callIndex == $callLen} {
                        lappend map [lindex $arg 0] [lindex $arg 1]
                    } else {
                        error \
                            "callIndex $callIndex out of range $callLen"
                    }
                } else {
                    error "bad arg $arg"
                }
            }
            argWithDef {
                if {[llength $arg] == 1} {
                    if {$arg eq "args"} {
                        set mode args
                        if {$callIndex < $callLen} {
                            lappend map $arg [
                                lrange $call $callIndex end
                            ]
                        } elseif {$callIndex == $callLen} {
                            lappend map $arg {}
                        } else {
                            error \
                            "callIndex $callIndex out of range $callLen"
                        }
                    } else {
                        error "bad arg $arg after arg with default"
                    }
                } elseif {[llength $arg] == 2} {
                    if {$callIndex < $callLen} {
                        lappend map [lindex $arg 0] [
                            lindex $call $callIndex
                        ]
                        incr callIndex
                    } elseif {$callIndex == $callLen} {
                        lappend map [lindex $arg 0] [lindex $arg 1]
                    } else {
                        error \
                            "callIndex $callIndex out of range $callLen"
                    }
                } else {
                    error "bad arg $arg after arg with default"
                }
            }
            args {
                error "bad arg $arg after args"
            }
        }
    }
    return $map
}

}

}