1

因此,我使用了类似名称的线程来使用 list 命令使其工作。这是我的工作代码:

proc E364xA::Connect [list [list VisaAlias ${E364xA::DefaultAlias}]] {

    ::VISA::Connect $VisaAlias
}

现在,通过使用存储在命名空间 eval 中的 DefaultAlias 中的值,这目前正在工作。我想知道是否有更直观的方法可以做到这一点:

proc E364xA::Connect {{VisaAlias ${E364xA::DefaultAlias}}} {

    ::VISA::Connect $VisaAlias
}

这样你就不会有两个列表命令混淆水域。有任何想法吗?

我在这里先向您的帮助表示感谢!

4

3 回答 3

4

我没有看到任何提供更多语法糖的不同方式。但是,您可以执行以下操作:

proc E364xA::Connect {{VisaAlias -use-default}} {
    if {$VisaAlias == "-use-default"} { 
        set VisaAlias ${E364xA::DefaultAlias}
    }

    ::VISA::Connect $VisaAlias
}

示例用法:

E364xA::Connect                 ;# Use the default value
E364xA::Connect -use-default    ;# Use the default value
E364xA::Connect somethingElse   ;# Non default
于 2013-01-02T16:27:46.310 回答
1

也许这个?(删除了以前的编辑。)

proc E364xA::Connect "{VisaAlias {$E364xA::DefaultAlias}}" {

    ::VISA::Connect $VisaAlias
}

测试

这是一个简化的测试:

set def "hello, world!"

proc test "{var {$def}}" {
    puts $var
}

test

输出:

hello, world!
于 2013-01-02T16:28:03.690 回答
1

您可以使用该args参数,但它并不比您的代码清晰得多,并且它隐藏了您的 proc 最多应采用 1 个参数的事实。

proc E364xA::Connect args {
    if {[llength $args] == 0} {
        set VisaAlias $E364xA::DefaultAlias
    } else {
        set VisaAlias [lindex $args 0]
    }
    ::VISA::Connect $VisaAlias
}

或者

proc E364xA::Connect args {
    ::VISA::Connect [expr {[llength $args] ? [lindex $args 0] : $E364xA::DefaultAlias}]
}
于 2013-01-02T16:37:23.043 回答