closure应用一例 (Common Lisp实现)

发布于 2022-08-12 09:55:37 字数 1308 浏览 12 评论 9

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)))

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

无所的.畏惧 2022-08-18 02:39:27

运算封闭我觉的实在不是一个好词.

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

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

[ 本帖最后由 chenzengjie 于 2009-1-4 14:01 编辑 ]

再浓的妆也掩不了殇 2022-08-18 02:37:49

原帖由 win_hate 于 2009-1-4 13:39 发表
SICP 上的说的 Closure 指的是运算封闭。

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

忆沫 2022-08-18 02:37:48

SICP 上的说的 Closure 指的是运算封闭。

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

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

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

温暖的光 2022-08-18 02:26:35

这里的closure应该是指带有上下文的函数定义。
这在scheme里是内建的,也就是函数的环境属性。

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

多像笑话 2022-08-18 02:20:20

原帖由 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 跟这个是一致的吗?

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

醉态萌生 2022-08-16 02:50:48

原帖由 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 编辑 ]

弱骨蛰伏 2022-08-14 21:54:19

closure 在 Perl 中被用来实现函数模板,在 Lisp 中应该也可以起类似的作用。

百变从容 2022-08-14 18:51:33
  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 编辑 ]

花伊自在美 2022-08-13 11:45:04

不错,交替插入空格或数字。

Lisplogo_alien_256.png (20.29 KB, 下载次数: 4)

下载附件

2008-10-15 21:23 上传

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文