我想我明白(一般)什么shift
和reset
的意思。但是我不明白他们为什么这样命名? shift
和reset
作为分隔延续原语与英语中的“移位”和“重置”单词有什么关系?为什么命名为“shift”和“reset”的分隔延续原语?
30
A
回答
23
他们被称为是因为他们的实施方式(一般)。
从Direct Implementation of Shift and Reset in the MinCaml Compiler
引通过解读使用 延续语义的程序,我们可以把 程序的状态作为 延续堆栈。然后,
reset
可以是 想到作为继续 堆栈和shift
捕获 延续堆栈最多 由reset
创建的标记。这里是 概述的执行情况:
- 当调用
reset
,一个重置标记设置到堆栈- 当调用
shift
(fun k -> M)
,移动堆栈的一部分帧达到 最近重置标记到堆- 当调用延续
k
时,将重置标记设置为堆栈并复制相关的 从栈堆栈到 栈顶。甲重置标记被插入时
k
是 调用,因为捕获 在一个空的连续执行的延续。
5
因为那是方式Danvy & Filinski叫这两个运营商the first paper where they exposed that model of continuation-passing style(见here),并且它是什么斯卡拉实现。
在Scala中的实现在this other paper中描述。在其中以Danvy & Filinski基准是明确的:
在本文中,我们研究了添加控制操作员的移动和复位该语言框架,它们一起实现静态分隔延续(Danvy和Filinski 1990,1992)
相关问题
- 1. 为什么没有String#shift()?
- 2. 为什么Covariance和Contravariance这样命名?
- 3. 为什么命名不同?
- 4. 为什么jQuery被称为jQuery?名称的原因是什么?
- 5. 为什么内存部分的命名前缀为'。'
- 6. 为什么git命令切换名为“git checkout”的分支?
- 7. 为什么必须调用io_service :: reset()?
- 8. 为什么git reset不起作用?
- 9. 为什么BufferedInputStream#reset()没有抛出RuntimeException?
- 10. 为什么case class被命名为'case'?
- 11. 为什么Node.js命名为Node.js?
- 12. 为什么subprocess.Popen类未命名为Subprocess?
- 13. 为什么不将Array.prototype.some命名为.any?
- 14. 为什么`pattern.test(名称)`连续通话
- 15. 为什么log4j重命名文件名?
- 16. 为什么git reset --hard和push --force不能恢复我的远程分支
- 17. 为什么bzr分支继续被杀?
- 18. 斯卡拉:分隔延续解释 - 在连续的概念不
- 19. 命名参数是方法签名的一部分吗?如何和为什么?
- 20. (call/cc):什么是延续?
- 21. 为什么文件名已被部分重命名?
- 22. 为什么我的第一个值在reset()为null?
- 23. 为什么HttpServletRequest#getParameterValues(“key”)将分号识别为分隔符?
- 24. GTK3和Python:为什么set_property延迟?
- 25. CLOCK,RESET和ENABLE信号统称为什么?
- 26. 'reset hard head'和'reset hard'之间的区别是什么?
- 27. JFrame和为什么要继续运行
- 28. 什么是DocumentDb中延续令牌的寿命
- 29. 为什么python隐式行延续期间?
- 30. 这篇文章为什么不延续下去?
值得注意的是,Scala的定界延续并没有以这种直接的方式实现 - 他们不能。 JVM不公开堆栈操作原语。 – 2011-05-13 15:18:49
相比之下,Scheme-48确实允许直接实现(Gasbichler/Sperber),就像任何暴露调用堆栈的语言一样,如Squeak Smalltalk。 – 2011-05-22 20:55:52