代码之家  ›  专栏  ›  技术社区  ›  Nir Levy

Tcl匿名函数

tcl
  •  7
  • Nir Levy  · 技术社区  · 14 年前

    一个纯粹的理论问题。

    跟随 this question 我在想,在Tcl中实现匿名函数的最佳方法是什么。

    do_something $data {proc {} {input} {
        puts $input;
    }};
    

    类似于javascript

    do_something(data, function (input) {
        alert(input);
    });
    

    现在,这自然不会奏效。我在想这样的事:

    proc do_something {data anon_function} {
        anon_run $anon_function $data
    }
    proc anon_run {proc args} {
        set rand proc_[clock clicks];
        set script [lreplace $proc 1 1 $rand];
        uplevel 1 $script;
        uplevel 1 [concat $rand $args];
        uplevel 1 rename $rand {}; //delete the created proc
    }
    

    这很管用。但我希望得到一个更好的模式的建议,然后这个,因为它不是很优雅,并没有真正使用很酷的Tcl功能。基本上我不想再打电话了 anon_run .

    1 回复  |  直到 7 年前
        1
  •  12
  •   Donal Fellows    14 年前

    在tcl8.5中,您可以使用 apply 命令。

    proc do_something {data anon_function} {
        apply $anon_function $data
    }
    do_something $data {{input} {
        puts $input
    }}
    

    proc lambda {arguments body} {
        # We'll do this properly and include the optional namespace
        set ns [uplevel 1 namespace current]
        return [list ::apply [list $arguments $body $ns]]
    }
    
    proc do_something {data command} {
        {*}$command $data
    }
    
    do_something $data [lambda {input} {
        puts $input
    }]
    

    如果您使用的是8.4或更早版本,则需要 code from the Tcler's Wiki