- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从 tcl
8.6 开始,什么是惯用形式或闭包
?
已发布 patterns看起来很困惑,下面的也是如此。
例子:
#!/usr/bin/env tclsh
::oo::class create Main {
method ensurePath {url args} {
# closure definition, takes time to recognize
set performPath [list my performPath $url {*}$args]
if {0} {
# closure application, can reduce needless noise?
{*}$performPath alpha beta
} elseif {1} {
{*}$performPath omega gamma
} else {
# no performPath
}
}
method performPath {url args} {
puts "[self class]::[self method] {$args}"
}
}
set main [Main new]
$main ensurePath url one two
输出:
::Main::performPath {one two omega gamma}
最佳答案
Tcl 不会完全关闭,但它可以针对关键用例进行有限版本的关闭;如果您看到 {*}
应用于命令的第一个单词,这就是正在发生的事情。例如,您正在执行 (object) 回调 用例。这很简单:
set performPath [namespace code [list my performPath $url {*}$args]]
(命名空间代码
确保回调将在正确的命名空间中被评估,即使从对象外部运行也是如此。)
我们甚至可以通过定义辅助过程来使它更整洁:
proc ::oo::Helpers::callback {method args} {
tailcall namespace code [list my $method {*}$args]
}
set performPath [callback performPath $url {*}$args]
同样,变量捕获用例也可以完成。这是假设所有变量都不是数组的最简单版本:
proc closure {body} {
set binding {}
foreach v [uplevel 1 info locals] {
upvar 1 $v var
if {[info exists var]} {
lappend binding [list $v $var]
}
}
return [list apply [list $binding $body [uplevel 1 namespace current]]]
}
演示如何使用它:
proc foo {n} {
set result {}
for {set i 1} {$i <= $n} {incr i} {
lappend result [closure {
puts "This is $i of $n"
}]
}
return $result
}
foreach c [lreverse [foo 10]] {
{*}$c
}
(处理数组和参数使这变得更加复杂。)
如果您需要在“闭包”中修改状态,那么您需要使用对象或协程来保存状态。它们中的任何一个的主要问题是您需要在完成后明确清理生成的命令;标准 Tcl 不会垃圾收集未使用的命令。
关于closures - Tcl:惯用语 ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50453363/
Tcl 有 apply和 lambda , 但没有闭包。 从 tcl 8.6 开始,什么是惯用形式或闭包? 已发布 patterns看起来很困惑,下面的也是如此。 例子: #!/usr/bin/env
是否有可能以某种方式完成以下操作: x.hpp - 此文件包含在许多其他类中 class x_impl; //forward declare class x { public:
我使用 Idiorm作为 MySQL 和 PHP 的 ORM。 我需要检查表是否已创建。 在 SQL 中 这在 phpMyAdmin 中有效 SHOW TABLES LIKE 'ro_globals'
假设我们有一个返回一些值和错误的函数。处理错误和值声明的首选方式是什么? func example_a(data interface{}) (interface{}, error) { var
这样的事情存在吗? ruby : if __FILE__ == $0 main end Perl: unless(caller) { main; } 卢阿: if type(packa
我正在阅读以下问题: What is the copy-and-swap idiom? 我的印象是,当按值传递对象时,它的指针和值会被复制,但被传递对象的指针指向的内存不会被复制。因此,当从链接到示例
Java tryLock(long time, TimeUnit unit)可以用作获取锁的非阻塞尝试。如何实现python中的等价物? (首选 Pythonic | idiomatic 方式!) J
我正在阅读 J. Bloch 的《effective Java》一书,现在正阅读有关惰性初始化的部分。考虑以下类: public class LazyInit{ public static g
我最近一直在写一些 Clojure,我发现自己经常使用以下模式: (let [x (bam) y (boom)] {:x x :y y}) 所以我继续写了下面的宏: (defma
我开始玩 Go,对 new 函数有点恼火。它似乎非常有限,尤其是在考虑具有匿名字段或内联初始化的结构时。所以我通读了规范和 stumbled over the following paragraph
Python 库公开一个通用的“opener”函数并不少见,它接受一个字符串作为它们的主要参数,该字符串可以表示一个本地文件名(它将打开并对其进行操作),一个 URL(它将下载并对其进行操作)或数据(
我想了解一些 Perl 用于逐块读取文本文件的代码。 文本文件 MYFILE看起来像这样: First block First Line: Something in here Second Line:
我是一名优秀的程序员,十分优秀!