【发布时间】:2021-10-09 09:36:36
【问题描述】:
为了进一步了解call/cc,我看到How does the yin-yang puzzle work?问题和this explaination关于阴阳谜题:
(let*
(
(yin (
(lambda (cc) (display #\@) cc)
(call/cc (lambda (c) c))
))
(yang (
(lambda (cc) (display #\*) cc)
(call/cc (lambda (c) c))
))
)
(yin yang)
)
到目前为止,我可能(或可能不)理解阴阳谜题的概念。但是我发现scheme语法不是特别好理解,一搜发现ruby有Continuation模块。由于 ruby 语法遵循过程式风格,我发现 ruby 代码比方案代码更容易阅读。因此我决定将这个谜题翻译成 ruby 版本(我既是 scheme 又是 ruby 新手):
require "continuation"
yin = (lambda do |cc|
print "@"
return cc
end).call(callcc {|c| c})
yang = (lambda do |cc|
print "*"
return cc
end).call(callcc {|c| c})
yin.call(yang)
但是这个版本打印出@*@***********... (demo here) 而不是@*@**@***@****@*****@**...,这不是我所期望的。
我的 ruby 版本是否正确?如果它不正确,那么我真的不知道从这里该怎么做......
【问题讨论】:
-
"...我发现阅读 ruby 代码比阅读方案代码容易得多。" -- 好吧,当它被格式化时阅读 lisp 代码要困难得多以花括号语言的方式。不要将括号分散在不同的行上;研究以惯用方式编写的 lisp 代码的格式,并模仿它。一旦你习惯了 lisp 的典型格式化方式,它就会像任何其他代码一样容易和自然地阅读。
标签: ruby scheme continuations