Tclsh只能支持用户类型的部分tcl命令,但tcl脚本不支持

Tclsh只能支持用户类型的部分tcl命令,但tcl脚本不支持,tcl,Tcl,我们实现了一些tcl命令,如果我们在tcl shell交互模式下在tcl>提示符下只键入部分命令,tcl shell可以识别该命令。但如果我们在tcl脚本文件中放入相同的部分命令,然后从tcl shell中获取脚本,则会报告未知命令。并且可以识别tcl sript中的整个命令 如何使源tcl脚本行为与shell交互模式相同?我们期望当源tcl脚本时,部分命令也可以重新编译 请看下面的例子 在shell交互模式下可以识别部分命令 source run.tcl脚本运行时无法识别Partial命令 a

我们实现了一些tcl命令,如果我们在tcl shell交互模式下在tcl>提示符下只键入部分命令,tcl shell可以识别该命令。但如果我们在tcl脚本文件中放入相同的部分命令,然后从tcl shell中获取脚本,则会报告未知命令。并且可以识别tcl sript中的整个命令

如何使源tcl脚本行为与shell交互模式相同?我们期望当源tcl脚本时,部分命令也可以重新编译

请看下面的例子

  • 在shell交互模式下可以识别部分命令
  • source run.tcl脚本运行时无法识别Partial命令
  • a) run.tcl

    b) 获取脚本run.tcl的源代码


    Tcl在
    unknown
    过程中实现了部分命令名扩展(以及许多其他功能),并且只在交互模式下打开它。通常强烈建议在脚本中使用完整的命令名;这更有可能是可靠的

    如果您想启用它(我认为您不应该这样做),请执行此操作(此版本使用
    tailcall
    ,因此至少需要Tcl 8.6):

    rename unknown\u standard\u unknown
    proc未知参数{
    set cmd[lindex$args 0]
    设置匹配项[uplevel 1[列表信息命令$cmd*]]
    #如果存在唯一匹配项,请使用它
    如果{[llength$匹配]==1}{
    lset参数0[lindex$匹配0]
    tailcall{*}$args
    }
    tailcall_标准_未知{*}$args
    }
    

    理论上,您还可以将
    tcl_interactive
    global设置为任何真实值(例如
    1
    )以启用扩展。但是,这样做也可能会导致其他不必要的行为;Tcl对此不作任何保证。

    IMO,您不应该这样做,脚本文件应该包含完整的命令/选项名称。但是,在交互式tclsh会话中,检查proc(使用
    info body unknown
    ),并将该实现(或其相关部分)复制到tcl脚本/库中。谢谢,因此建议在脚本文件中使用完整的命令名。没关系,谢谢你,多纳尔!然后我认为在脚本中使用全名是可以的,如果它更可靠的话。
    Tcl> my_prove
    Info: proving started
    Info: ....
    Info: ....
    
    Tcl> my_pro
    Info: proving started
    Info: ....
    Info: ....
    
       setup_design
       my_prove
       my_pro
    
    Tcl> source run.tcl
    $inside source$$> setup_desgin
        Design setup...
        Done
    $inside source$$> my_prove
        Info: proving started
        Info: ....
        Info: ....
    $inside source$$> ::unknown my_pro
        invalid command name "my_pro"