免费注册 查看新帖 |

Chinaunix

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

Scheme continuation 之阴阳谜题 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-09 01:11 |只看该作者 |倒序浏览
以下为阴阳谜题的 scheme 代码:
  1. (let* ((yin ((lambda (foo) (display "@") foo)
  2.              (call/cc (lambda (bar) bar))))
  3.        (yang ((lambda (foo) (display "*") foo)
  4.               (call/cc (lambda (bar) bar)))))
  5.   (yin yang))
复制代码
以上程序运行的结果为:
@*@**@***@****@*****@******
...

之所以会出现如此结果(循环渐增的打印星号),都是 scheme 中的 continuation 在作怪!
以下让我们来分析以下这个程序吧!
     
其中:
(call/cc (lambda (bar) bar))
此表达式返回当前的 continuation

(lambda (foo) (display "@") foo)
此表达式先是打印 "@" 字符,然后把 foo 参数作为函数的返回值返回

((lambda (foo) (display "@" foo))
     (call/cc (lambda (bar) bar)))
此表达式先是打印 "@" 字符,然后把当前的 continuation 作为函数返回值返回

环境1:
在 let* 语句中,首先对 yin、yang 变量依次赋值
yin、yang 都被赋为一个 continuation
两个 continuation 假设分别为 @CC 和 *CC
yin=@CC       同时打印 @
yang=*CC      同时打印 *

运行 (yin yang)
即为 (@CC *CC)

环境2:
此时,由于 (@CC *CC) 表达式调用 @CC continuation 把 *CC 作为返回值返回
从而 yin、yang 被重新赋值(两者仍都是一个 continuation)
yin=*CC           同时打印 @
yang=**CC      同时打印 *
注:
之所以 yang 等于 **CC 而不是 *C,是因为 yang 被赋值前,yin 已被赋值为*C,
其不同于 环境1 中的 yin(环境1 中的 yin 被赋值为 @CC)

运行 (yin yang)
即为 (*CC **CC)

环境3:
此时,由于 (*CC **CC) 表达式调用 *CC continuation 把 **CC 作为返回值返回
在此要注意 *CC 所在的环境(yin 已被赋值为 @CC,yang被赋值为 call/cc 函数的返回值,在此即为 **CC)
从而 yang 被重新赋值
yin=@CC
yang=**CC      同时打印 *

运行 (yin yang)
即为 (@CC **CC)

环境4:
此时,由于 (@CC **CC) 表达式调用 @CC continuation 把 **CC 作为返回值返回
从而 yin、yang 被重新赋值
yin=**CC    同时打印 @
yang=***CC      同时打印 *
注:
之所以 yang 等于 ***CC,是因为 yang 被赋值前,yin 已被赋值为**C,
其不同于 环境1/环境2 中的 yin(环境1 中的被赋值为 @CC,环境2 中被赋值为 *CC)

运行 (yin yang)
即为 (**CC ***CC)

环境...,往复循环不止
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP