免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6845 | 回复: 10
打印 上一主题 下一主题

closure应用一例 (Common Lisp实现) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-15 19:45 |只看该作者 |倒序浏览
http://bbs.chinaunix.net/thread-1260094-1-1.html
http://bbs.chinaunix.net/thread-1261686-1-2.html


  1. (let ((s "                                       ")
  2.       (i -1))
  3.   (defun next ()
  4.     (setf s (format nil "~A~A~A"
  5.                     (subseq s 1 20)
  6.                     (if (eql (char s 19) #\ )
  7.                         (setf i (+ i 1))
  8.                       #\ )
  9.                     (subseq s 19 38)))))

  10. (dotimes (n 20)
  11.   (format t "~A~%" (next)))
复制代码

论坛徽章:
0
2 [报告]
发表于 2008-10-15 21:23 |只看该作者
不错,交替插入空格或数字。



[ 本帖最后由 win_hate 于 2008-10-15 21:30 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-01-04 11:11 |只看该作者

  1. (define (tri from to)
  2.   (define (left n)
  3.     (cond ((> n 0)
  4.                (display " ")
  5.                (left (- n 1)))))
  6.   (define (right n)
  7.     (define (iter i)
  8.       (cond ((< i 0)
  9.                  (newline))
  10.                 ((= 0 (remainder i 2))
  11.                  (display " ")
  12.                  (iter (- i 1)))
  13.                 (else
  14.                  (if (< i (/ n 2))
  15.                      (display (/ (- i 1) 2))
  16.                      (display (- (quotient n 2) (/ (- i 1) 2))))
  17.              (iter (- i 1)))))
  18.     (iter n))
  19.   
  20.   (cond ((< from to)
  21.              (left (- to from))
  22.              (right (- (* 2 from) 1))
  23.              (tri (+ from 1) to))))

复制代码

[ 本帖最后由 x2 于 2009-1-4 11:57 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2009-01-04 11:49 |只看该作者
closure 在 Perl 中被用来实现函数模板,在 Lisp 中应该也可以起类似的作用。

论坛徽章:
0
5 [报告]
发表于 2009-01-04 12:09 |只看该作者
原帖由 MMMIX 于 2009-1-4 11:49 发表
closure 在 Perl 中被用来实现函数模板,在 Lisp 中应该也可以起类似的作用。


perl 的 closure 具体指的是什么?这个词我好像总是消化不了。在 SICP 中,对 closure 描述为

In general, an operation for combining data objects satisfies the closure property if the results of combining things with that operation can themselves be combined using the same operation.

Closure is the key to power in any means of combination because it permits us to create hierarchical structures -- structures made up of parts, which themselves are made up of parts, and so on.


perl 的 closure 跟这个是一致的吗?

[ 本帖最后由 win_hate 于 2009-1-4 12:11 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2009-01-04 12:58 |只看该作者
原帖由 win_hate 于 2009-1-4 12:09 发表


perl 的 closure 具体指的是什么?这个词我好像总是消化不了。

Perl 的 closure 在 perlref 中介绍,执行 perldoc perlref 然后搜索 closure 就能看到。在看 Scheme 的时候,也被 closure 搞的有点迷糊,不过 perlref 中对 closure 的解释我倒是看明白了,它是这么说的:
Closure is a nation out of the Lisp world that says if you define an anonymous function in a particular lexical context, it pretends to run in that context even when it's called outside the context.

下面紧接着就是个例子。

perl 的 closure 跟这个是一致的吗?

不知道,你引的那两段我没看明白。

论坛徽章:
0
7 [报告]
发表于 2009-01-04 13:28 |只看该作者
这里的closure应该是指带有上下文的函数定义。
这在scheme里是内建的,也就是函数的环境属性。

sicp有注脚说明了这两种closure解释的区别。

论坛徽章:
0
8 [报告]
发表于 2009-01-04 13:39 |只看该作者
SICP 上的说的 Closure 指的是运算封闭。

SICP 中文版 65 页有一个注脚,说:Lisp 社团还用术语“闭包”描述一个与此毫不相干的概念:闭包也是一种表示带有自由变量的过程而用的实现技术。

MMMIX 说的 Closure 就是后一种。这个闭包似乎在计算机领域里更普遍一些,英文为 lexical closuer。

[ 本帖最后由 win_hate 于 2009-1-4 13:45 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2009-01-04 13:51 |只看该作者
原帖由 win_hate 于 2009-1-4 13:39 发表
SICP 上的说的 Closure 指的是运算封闭。

你一说运算封闭我就明白了

论坛徽章:
0
10 [报告]
发表于 2009-01-04 13:53 |只看该作者
运算封闭我觉的实在不是一个好词.

APL 如同钻石,有着美妙的晶体结构;它的所有部分都以一致和优美的方式关联在一起。但是如果你尝试以任何方式扩展这种结构 - 即使是增加另一个钻石 - 你将得到一个丑陋的杂种。在另一方面,LISP 如同泥球。你可以向它增加任意数量的泥巴,它看起来还是个泥球。

由此看来closure这个概念在lisp里实在是很根本的.

[ 本帖最后由 chenzengjie 于 2009-1-4 14:01 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP