<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.3.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>
<channel>
	<title>Comments on: 循环迭代器和闭包</title>
	<link>http://blog.youxu.info/2008/03/06/iterator-and-closure/</link>
	<description>IT Tech Linux Life Oversea USA MacOSX</description>
	<pubDate>Sat, 17 May 2008 18:04:05 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.2</generator>
		<item>
		<title>By: Shiyuan</title>
		<link>http://blog.youxu.info/2008/03/06/iterator-and-closure/#comment-2880</link>
		<dc:creator>Shiyuan</dc:creator>
		<pubDate>Wed, 19 Mar 2008 04:58:47 +0000</pubDate>
		<guid>http://blog.youxu.info/2008/03/06/iterator-and-closure/#comment-2880</guid>
		<description>一直关注你的blog,受益非浅。
我不懂函数语言，但语法确实简洁漂亮，逻辑层次清晰。但漂亮的语法背后是否以运行效率为代价？暑假要参加一summer program, 要求python, 可否推荐一phython经典</description>
		<content:encoded><![CDATA[<p>一直关注你的blog,受益非浅。<br />
我不懂函数语言，但语法确实简洁漂亮，逻辑层次清晰。但漂亮的语法背后是否以运行效率为代价？暑假要参加一summer program, 要求python, 可否推荐一phython经典</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: zz</title>
		<link>http://blog.youxu.info/2008/03/06/iterator-and-closure/#comment-2851</link>
		<dc:creator>zz</dc:creator>
		<pubDate>Mon, 10 Mar 2008 03:06:41 +0000</pubDate>
		<guid>http://blog.youxu.info/2008/03/06/iterator-and-closure/#comment-2851</guid>
		<description>不错的文章....最近对于选择正确的工具/语言做正确的事情有点感悟。
如果说sap的软件古老而陈旧，但是能够存活这么多年，多多少少和ABAP这种灵活的石器语言有关。
ABAP在操作数据(有的时候是海量)时候的迭代技巧非常tricky, 却很得劲...</description>
		<content:encoded><![CDATA[<p>不错的文章&#8230;.最近对于选择正确的工具/语言做正确的事情有点感悟。<br />
如果说sap的软件古老而陈旧，但是能够存活这么多年，多多少少和ABAP这种灵活的石器语言有关。<br />
ABAP在操作数据(有的时候是海量)时候的迭代技巧非常tricky, 却很得劲&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Eric</title>
		<link>http://blog.youxu.info/2008/03/06/iterator-and-closure/#comment-2850</link>
		<dc:creator>Eric</dc:creator>
		<pubDate>Fri, 07 Mar 2008 13:48:58 +0000</pubDate>
		<guid>http://blog.youxu.info/2008/03/06/iterator-and-closure/#comment-2850</guid>
		<description>@yufei 
感谢留言，我写的时候没有细致的区分内部迭代器和外部迭代器，的确应该区分开来看。

关于Python 中的 closure, 平时这方面特性没用过，我都不知道那个语法在 Python 中不行， 

SICP 的确是一本好书，羡慕你在本科就读过</description>
		<content:encoded><![CDATA[<p>@yufei<br />
感谢留言，我写的时候没有细致的区分内部迭代器和外部迭代器，的确应该区分开来看。</p>
<p>关于Python 中的 closure, 平时这方面特性没用过，我都不知道那个语法在 Python 中不行， </p>
<p>SICP 的确是一本好书，羡慕你在本科就读过</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: shallwe</title>
		<link>http://blog.youxu.info/2008/03/06/iterator-and-closure/#comment-2849</link>
		<dc:creator>shallwe</dc:creator>
		<pubDate>Fri, 07 Mar 2008 13:12:26 +0000</pubDate>
		<guid>http://blog.youxu.info/2008/03/06/iterator-and-closure/#comment-2849</guid>
		<description>从简单的语句映射出背后的设计哲学, 很是受益.</description>
		<content:encoded><![CDATA[<p>从简单的语句映射出背后的设计哲学, 很是受益.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: chenyufei</title>
		<link>http://blog.youxu.info/2008/03/06/iterator-and-closure/#comment-2848</link>
		<dc:creator>chenyufei</dc:creator>
		<pubDate>Fri, 07 Mar 2008 08:17:00 +0000</pubDate>
		<guid>http://blog.youxu.info/2008/03/06/iterator-and-closure/#comment-2848</guid>
		<description>a.SomeIterator(func)

这种迭代实际上就使用了内部迭代器，迭代的过程完全由迭代器来控制，在 Head First Design Patterns 中有解释。但是这种迭代方式在不能同时遍历多个容器时，如果使用类似 Lisp 里面的 map，以多个容器作为参数，就可用同时遍历多个容器了。但即使这样仅仅使用内部迭代器还是不够的。

外部迭代器（如传统的 C++，Java 中的 iterator）有用的地方就在我们想完全控制控制迭代过程的时候，比如发现某个元素不满足某个条件时马上停止迭代过程，再比如写一个 merge 来来合并多个已经排序的容器的时候，我们必须自己控制什么时候需要取下一个元素。另外在我们希望删除容器内某些元素的时候外部迭代器也更为方便。

我在学设计模式的时候写过一篇关于内部迭代器和回调函数的文章，有很多想法跟你是一样的。广告一下，有兴趣的话可以看看。http://chenyufei.name/blog/2006-11-23/glqivdhfznivketminoibourjzcauicausjq/

关于 closure。在我看来 closure 一个很有用的地方在于使得函数可以带有状态，就像对象一样，可以利用 function builder 来创建带有不同状态的函数。因此在 Lisp 这样的语言里面没有对象日子照样非常美好。比如用 a.each max 来找到一个 a 中的最大值，函数 max 必须要能够记录迭代过程中遇到的最大值，有 closure 的话是非常方便的。在 C++ 里面用 functor 固然可以做到，但是单独定义一个类实在是麻烦，用全局变量加函数指针则在多线程时会有麻烦。在 Java 里面引入匿名内部类实际上就方便了这种用法。（当然，Java 不支持函数指针使它更迫切的需要匿名内部类。）

Python 为了保持语言简单放弃了很多特性，比如它对 closure 的支持并不完全，函数所引用的自由变量（即函数作用域外的变量）不能被修改。比如下面的代码在 Python 中是不合法的：


def stamp(t):
    return lambda : t += 1

st1 = stamp(0)
print st1()
print st1()

st2 = stamp(10)
print st2()
print st2()


执行的时候会直接在 t = t + 1 这里报语法错误。

Ruby 支持 full closure，所以在 Ruby 里面这样写是可以的：


def stamp(t)
  return lambda { t += 1 }
end

st1 = stamp(0)
p st1.call() # 1
p st1.call() # 2

st2 = stamp(10)
p st2.call() # 11
p st2.call() # 12


不过 Ruby 里面返回的是一个 Proc 对象，要通过 call 来调用而不能像普通的函数一样来调用。

SICP 对 closure 的解释和应用都非常清楚，有疑问或者想要深入了解的人可以看它第三章的环境求值模型来理解 closure。不过现代语言为了效率和程序的清晰一般都使用 lexical scope，SICP 第三章里的环境模型是针对 dynamic scope 的，但也有助于对 closure 的理解。（实际上 dynamic scope 里也能实现 closure，Ansi Common Lisp 一书的脚注提到，closure 的名字来源于早期 Lisp 使用 dynamic scope 时实现 closure 的方式。）</description>
		<content:encoded><![CDATA[<p>a.SomeIterator(func)</p>
<p>这种迭代实际上就使用了内部迭代器，迭代的过程完全由迭代器来控制，在 Head First Design Patterns 中有解释。但是这种迭代方式在不能同时遍历多个容器时，如果使用类似 Lisp 里面的 map，以多个容器作为参数，就可用同时遍历多个容器了。但即使这样仅仅使用内部迭代器还是不够的。</p>
<p>外部迭代器（如传统的 C++，Java 中的 iterator）有用的地方就在我们想完全控制控制迭代过程的时候，比如发现某个元素不满足某个条件时马上停止迭代过程，再比如写一个 merge 来来合并多个已经排序的容器的时候，我们必须自己控制什么时候需要取下一个元素。另外在我们希望删除容器内某些元素的时候外部迭代器也更为方便。</p>
<p>我在学设计模式的时候写过一篇关于内部迭代器和回调函数的文章，有很多想法跟你是一样的。广告一下，有兴趣的话可以看看。http://chenyufei.name/blog/2006-11-23/glqivdhfznivketminoibourjzcauicausjq/</p>
<p>关于 closure。在我看来 closure 一个很有用的地方在于使得函数可以带有状态，就像对象一样，可以利用 function builder 来创建带有不同状态的函数。因此在 Lisp 这样的语言里面没有对象日子照样非常美好。比如用 a.each max 来找到一个 a 中的最大值，函数 max 必须要能够记录迭代过程中遇到的最大值，有 closure 的话是非常方便的。在 C++ 里面用 functor 固然可以做到，但是单独定义一个类实在是麻烦，用全局变量加函数指针则在多线程时会有麻烦。在 Java 里面引入匿名内部类实际上就方便了这种用法。（当然，Java 不支持函数指针使它更迫切的需要匿名内部类。）</p>
<p>Python 为了保持语言简单放弃了很多特性，比如它对 closure 的支持并不完全，函数所引用的自由变量（即函数作用域外的变量）不能被修改。比如下面的代码在 Python 中是不合法的：</p>
<p>def stamp(t):<br />
    return lambda : t += 1</p>
<p>st1 = stamp(0)<br />
print st1()<br />
print st1()</p>
<p>st2 = stamp(10)<br />
print st2()<br />
print st2()</p>
<p>执行的时候会直接在 t = t + 1 这里报语法错误。</p>
<p>Ruby 支持 full closure，所以在 Ruby 里面这样写是可以的：</p>
<p>def stamp(t)<br />
  return lambda { t += 1 }<br />
end</p>
<p>st1 = stamp(0)<br />
p st1.call() # 1<br />
p st1.call() # 2</p>
<p>st2 = stamp(10)<br />
p st2.call() # 11<br />
p st2.call() # 12</p>
<p>不过 Ruby 里面返回的是一个 Proc 对象，要通过 call 来调用而不能像普通的函数一样来调用。</p>
<p>SICP 对 closure 的解释和应用都非常清楚，有疑问或者想要深入了解的人可以看它第三章的环境求值模型来理解 closure。不过现代语言为了效率和程序的清晰一般都使用 lexical scope，SICP 第三章里的环境模型是针对 dynamic scope 的，但也有助于对 closure 的理解。（实际上 dynamic scope 里也能实现 closure，Ansi Common Lisp 一书的脚注提到，closure 的名字来源于早期 Lisp 使用 dynamic scope 时实现 closure 的方式。）</p>
]]></content:encoded>
	</item>
</channel>
</rss>
