- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的背景是 Javascript、Python 和一点 Haskell。我试图理解 callCC,有很多解释,但我找不到它们微不足道,我遇到了这个 https://www.cs.bham.ac.uk/~hxt/research/Logiccolumn8.pdf我觉得我几乎明白了,但我需要一些帮助来理解 C 代码。
下面是跳转回 GNU C 函数的代码。
void *label_as_result() {
return &&L;
L: printf("Jumped back into the function. \n");
}
main () {
void *p;
p = label_as_result();
printf("The function returned; now jump back into it.\n");
goto *p;
}
return 语句在 label_as_result 函数中起什么作用? main 中的 p 是否将堆栈帧存储在堆中以及停止的指令行中? 跳回函数意味着再次创建一个堆栈帧并从我们离开的地方继续?
这段代码下面有一段
But in a language with first-class functions and callCC, no such implementation restrictions apply. Just as with the label as a result in C, we can return a continuation introduced by callCC from a function so as to jump back into the function. When we did this with goto, the stack was smashed, but with callCC the function just returns again. Consider the following function
λ(). callCC(λk. λx. throw k (λy. x))
The continuation k is returned as part of the result, roughly analogous to returning a label as the result in C.
什么叫stack was bad,他的意思是如果你使用goto就会发生stackoverflow? callCC 如何使用蹦床解决这个问题?
正如许多人所说,callCC 提供了早期返回语义,这意味着它类似于 python 或 Javascript 中的 Yield 吗?是否可以使用yield 在Javascript 中编写callCC?
我如何在 Javascript 中构思上述代码
function* label_as_result() {
yield () => console.log("Jumped back into the function.");
}
p = label_as_result().next().value;
console.log("The function returned; now jump back into it.");
p();
它甚至可以简单地编写为没有任何生成器概念的
function label_as_result() {
return () => console.log("Jumped back into the function.");
}
p = label_as_result();
console.log("The function returned; now jump back into it.");
p();
这意味着 callCC 是一个返回延续的函数,但所有其他函数都采用延续。Continuations 就像需要在未来执行的未决定的代码,但是 callCC 就像需要在未来执行的预定义代码? (我是从框架和用户代码的 Angular 来谈论的)
最佳答案
What does return statement do in label_as_result function?
它返回标记为L
的指令的地址。也就是说,它返回编译器为 printf("Jumped back into the function.\n");
生成的代码在内存中存储的地址。
Does p in main store the stack frame in heap & the instruction line where it is stopped?
不,它存储L
标签所在的指令行。这就是它存储的全部内容。
Jump back to function means create a stack frame again and continue from where we left?
不,这意味着一次跳转,仅此而已 - 没有堆栈操作。控制流跳转到标记为 L
的行,但没有其他任何变化。堆栈保持不变。
What does stack was smashed, he meant stackoverflow can happen if you use goto?
实际上是下溢。当label_as_result
被调用时,一个帧被压入堆栈。当它返回时,该框架被弹出。然后我们跳转到L
,执行printf
,然后到达函数末尾,这将再次弹出堆栈。所以最终堆栈弹出的次数比压入的次数多。
How callCC is getting around this problem
通过实际执行您假设的 C 代码正在执行的操作:保存并恢复堆栈,而不是仅仅跳转到代码行,同时保持堆栈相同。
As many say callCC gives Early return semantics that means is it like yield in python or Javascript?
它们在某种意义上是相似的,它们都给你一种提前返回,并且它们可以用于一些相同的事情。您可以将 yield
视为一种更专业的工具,旨在提供一种更简单的方法来实现 callCC
的一些用例。
Is it possible to write callCC in Javascript using yield?
不可以,但可以使用callCC
在Scheme中写入yield
。 callCC
严格来说是两者中更强大的一个。
How I conceive the above code in Javascript
实际的 C 代码无法在 JavaScript 中复制(除非通过构建具有自己的堆栈的迷你虚拟机),因为 JavaScript 不允许您像这样销毁堆栈。
可以通过从 label_as_result
返回一个函数来实现不破坏堆栈的完整版本,就像在第二个代码示例中所做的那样。
That means callCC is a function that returns a continuation
callCC
是一个使用当前延续调用另一个函数的函数。这可用于返回延续。
Continuations are like Undecided code that need to be performed in future
当然,但我不会在这里说“需要”。您不必调用延续(或者您甚至可以多次调用它)。
but callCC is like predefined code that needs to be performed in Future?
不太清楚你的意思,但这听起来不对。 callCC
是一个让您可以访问当前延续的函数。
关于javascript - CallCC 是 goto 的改进版本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59234399/
我对编码还比较陌生,但并非完全没有经验。处理有关金融计算器的学校作业。如果你们中的任何人可以查看我的代码以了解不良做法/可能的改进等,那就太好了。 我确实添加了一个“动画”启动(有很多 printf
小目标Trick 论文链接: https://paperswithcode.com/paper/slicing-aided-hyper-inference-and-fine-tuning 代码链接:h
if (firstPositionCpc && (firstPosition > 0 && firstPositionCpc 0 && topOfPageCpc 0 && firstPageCpc
我有 2 个表:“packages”和“items”。 “packages”有以下列:pack_id | item_id “items”有以下列......:item_id |输入 一个包可以有多个
我目前有一个 Pandas Dataframe,我在其中执行列之间的比较。我发现一种情况,在进行比较时存在空列,由于某种原因比较返回 else 值。我添加了一个额外的语句来将其清理为空。看看我是否可以
我正在处理一个查询,通过首先舍入它们的主要日期时间键来连接一个数据库中的多个表。数据库包含来自 openhab 的性能数据,每个表只有一个名为 Time 的主日期时间行和一个名为 Value 的值行。
问候 我有一个程序创建一个类的多个实例,在所有实例上运行相同的长时间运行的 Update 方法并等待完成。我从 this question 开始关注 Kev 的方法将更新添加到 ThreadPool.
我想在下学期的类(class)中取得领先,所以我制作了这个基本版本的 Blackjack 来开始理解 C 的基础知识,我希望您有任何想法可以帮助我更好地理解 C 和其正常的编码实践。 C 中的很多东西
我有一个要求,比如: 给定一个数组,其中包含随机数。需要输出元素出现的次数,有自带解决方案: var myArr = [3,2,1,2,3,1,4,5,4,6,7,7,9,1,123,0,123];
这是我的数据库项目。 表user_ select id, name from user_; id | name ----+---------- 1 | bartek 2 | bartek
我已经完成了一个小批量脚本来调整(动态)一些图像的大小: for a in *.{png,PNG,jpg,JPG,jpeg,JPEG,bmp,BMP} ; do convert "$a" -resiz
是否有更 pythonic 的方法来执行以下代码?我想在一行中完成 parsed_rows 是一个可以返回大小为 3 或 None 的元组的函数。 parsed_rows = [ parse_row(
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
下面的代码完成了我想要的,但还有其他更像 python 风格的方式吗? 文件格式: key1:value1,key2:value2,... key21:value21,key22:value22,..
如果两个英文单词只包含相同的字母,则它们是相似的。例如,food 和 good 不相似,但 dog 和 good 相似。 (如果A与B相似,则A中的所有字母都包含在B中,B中的所有字母都包含在A中。)
我有以下结构来表示二叉树: typedef struct node *pnode; typedef struct node { int val; pnode left; pnode
我有一个区域,它由受约束的 delaunay 三角剖分表示。我正在解决在两点之间寻找路径的问题。我正在使用 Marcelo Kallmann 提供的论文作为解决此问题的引用点。然而,而不是使用 Kal
如果我需要检查文本(字符串)中是否存在单词 A 或单词 B,如果我这样做会有性能差异: if(text.contains(wordA) || text.contains(wordB)) 要使用一些正则
Adjust To 我有上面这个简单的页面,上面有一个标签和一个文本框。我想在文本框中输入文本。 对我有帮助的 XPATH 是 //*[contains(tex
以下伪代码的elisp代码 if "the emacs version is less than 23.1.x" do something else something-else 写成 (if
我是一名优秀的程序员,十分优秀!