如何使用选项创建Tcl过程?

问题描述 投票:1回答:3

我想创建带有某些选项的tcl过程。我知道带有参数和可选参数的过程,但不知道选项。例如,如果我通过以下三种方式调用过程arith(-add用于加法,-sub用于减法):

1) arith 10 5 
2) arith -add 10 5   or   arith 10 5 -add
3) arith -sub 10 5   or   arith 10 5 -sub

分别输出应为1)15(默认情况下应加),2)15、3)5

如何在Tcl中编写此程序?我是tcl的新手,请向我建议一些有关Tcl的在线材料或书籍。

tcl procedure options
3个回答
3
投票

复杂的参数解析可以使用cmdline package完成,它是Tcllib的一部分。键盘命令为cmdline,可从变量中提取选项并返回描述它们的字典。它还会修改变量,使其仅包含剩余的参数。

::cmdline::getoptions

演示用法(包括一些错误情况):

package require cmdline
proc arith args {
    set options {
        {op.arg "add" "operation to apply (defaults to 'add')"}
    }
    array set parsed [::cmdline::getoptions args $options]
    if {[llength $args] != 2} {
        return -code error "wrong # args: must be \"arith ?-op operation? x y\""
    }
    switch $parsed(op) {
        add {return [::tcl::mathop::+ {*}$args]}
        sub {return [::tcl::mathop::- {*}$args]}
        default {
            return -code error "Unknown -op \"$parsed(op)\": must be add or sub"
        }
    }
}

主要要注意的是,如果希望将参数传递为,则选项描述符最后使用选项名称[[没有前导% arith wrong # args: must be "arith ?-op operation? x y" % arith 2 3 5 % arith -op sub 2 3 -1 % arith -op mult 2 3 Unknown -op "mult": must be add or sub with -好。


2
投票
关于选项,最好使用偶数个参数

.arg

有了这个,您可以将参数放入数组中,

-op add -values {10 5} -op sub -values {10 5}

其中array set aArgs $args
只是传递给过程的参数。

args


0
投票
在此示例中...我假设运算符是第一个或最后一个选项。该值为proc arith {args} { if {[catch {array set aArgs $args} err]} { puts "Error : $err" return 0 } if {![info exists aArgs(-op)] || ![info exists aArgs(-values)] || [llength $aArgs(-values)]!=2} { puts "Please pass valid args" return 0 } set x [lindex $aArgs(-values) 0] set y [lindex $aArgs(-values) 1] switch $aArgs(-op) { "add" { puts [expr {$x+$y}] } "sub" { puts [expr {$x-$y}] } } } arith -op add -values {10 5} -add。只需进行更改。

[计算中有一个优化...使用lrange和:: mathop ::。

add

示例:

proc arith args { if {[llength $args] != 3} { return -code error "wrong # args: must be \"arith ?-op operation? x y\"" } set isadd [lsearch $args add] set issub [lsearch $args sub] if {$isadd != -1 && $issub == -1} { return [expr [lindex $args 1] + [lindex $args [expr $isadd == 0 ? 2: 0]]] } if {$issub != -1 && $isadd == -1} { return [expr [lindex $args [expr $issub == 0 ? 1: 0]] - [lindex $args [expr $issub == 0 ? 2: 1]]] } return -code error "Unknown -op must be add or sub" }

这两个错误示例被注释掉,因为我需要一个捕获器,但是它实际上取决于全局以及其可重复使用性。

#arith add 1 2 3 #arith add sub 2 puts [arith add 1 2] puts [arith 1 2 add] puts [arith sub 1 2] puts [arith 1 2 sub]

© www.soinside.com 2019 - 2024. All rights reserved.