问题标签 [trampolines]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - 这个(类似蹦床的)结构有名字吗?
在创建类似于函数建议或方法组合的系统时,我想避免破坏堆栈。这涉及树遍历(在我的实现中)、条件递归等。可用于将递归转换为循环的极少数方法之一是蹦床。我已经尝试过了,然后发现我需要实现例如。短路布尔表达式求值。简而言之,我已经实现了蹦床与延续的组合,现在我试图找出这种结构是否存在以及它的名称可能是什么——因为我无法找到任何这样的已经存在的结构。
我的实现 - 带有手动堆栈处理的反弹评估:
弹跳类:
并且,例如,短路 AND 实现(即在 JavaScript 中first(args) && second(args)
)。$first
并且$second
是也可能返回Bounce
s 的函数。
这允许一般递归,每个普通函数调用大约有 3 个函数调用的开销(尽管在变量迭代计数的一般情况下,编写起来非常麻烦并且需要“惰性递归”)。
有没有人见过这样的结构?
javascript - JavaScript 中的蹦床 - 如何在递归调用中处理 try/catch
我有一个用 Javascript 编写的递归函数,由于过度的深度递归,它给出了 RangeError。因此,我使用蹦床对其进行尾部优化。这已将函数调用包装在一个 while 循环中,并且我已经摆脱了 RangeError。但是我需要在递归函数中处理抛出的异常(返回一级并进行一些纠正处理)。在使用蹦床时,我不确定如何处理这种情况。
我原来的递归函数(为了说明而简化):
我使用蹦床更新的递归函数(参考:了解函数式 JavaScript 编程中的递归)
使用更新的代码,只要val
不是负数并且没有引发异常,我就可以避免 RangeError。但是当val
结果为负并抛出异常时,我将直接进入蹦床捕获块。但是我需要回到上一层的 process() 的 catch 块。
你能建议我如何做到这一点吗?谢谢你的帮助!我查看了一些相关的帖子,但无法找出我需要的解决方案。
emacs - Emacs:ssh 远程服务器 repo 上的 magit 状态失败
我正在使用 ssh 连接到远程服务器。在服务器上有一个名为MRFLSSVM
. 但是,当我执行magit-status
时:
马吉特让我去Create repository in /ssh:qmServer:/home/Chang/qmCodeLab/MRFLSSVM/?
。
知道如何让 magit 识别该回购协议吗?(我已经在 /usr/local/git 上安装了 git 2.10.0 并将我的系统(CentOS)配置为通过 update-alternatives 使用它)
- - - - - -编辑 - - - - - - - - - - - - - - -
这个问题似乎tramp
是没有在远程服务器上使用正确的 git。我试图更改magit-git-executable
本地usr/local/git/bin/git
和远程安装 git 的路径。但这仍然行不通。
有什么想法可以解决这个问题吗?谢谢!
c++ - C++ 元编程中的蹦床
我正在读一本关于元编程的书,并且有关于 Trampolines 的分裂:
我完全理解它是如何工作的,但我不知道它的应用是什么!你通常在哪里使用这种技术?有人知道吗?谢谢 :)
javascript - 用 myValue() 替换 myValue 的正确术语
我不断地看到这种价值替换的模式,我试图弄清楚如何向我的同事解释这种替换。
问题
什么是正确的,确定的词:
- 这种替代
- 替代函数
在许多应用程序中,您需要重新查询该值,而不是使用现有的已定义变量。
高级用例:
- 蹦床
- 使用函数作为 React 子代,而不是 JSX / HTML
示例动画
如果您要在几秒钟内使用 0 到 1 之间的值调用 getTopValue,您最终会以初始 + 剩余
但是,如果你要调整屏幕大小,你的最终目的地是不同的,你必须将剩余值变成一个函数,而不是一个值
javascript - 导出函数需要设置为纯函数
在下面的 Trampoline 代码中,我将从
onclick = export(add,5)
视图中的按钮调用。如何确保此调用始终返回值5
而不取消注释//x=0
下面代码中的行?
基本上,我想要一个解决方案,其中变量 x 的范围将确保程序在执行 n 次时始终返回相同的输出(换句话说,我想将“导出”设置为纯函数)
c - 如何为 WinAPI 挂钩制作 Hook 和 Trampoline 功能
所以我一直在学习挂钩和使用蹦床的概念,以便绕过/执行 WinAPI 挂钩函数中的数据(在不同的可执行文件中,使用 DLL 注入)。到目前为止,我知道如何使用汇编和 C 的混合物来制作它(蹦床和钩子),但我似乎无法仅使用 C 来做到这一点,因为我似乎遗漏了一些东西。如果有人能告诉我我做错了什么以及如何解决它,我将不胜感激。
现在我的代码:
所以问题是:我如何让一个函数说
InstallHook
将安装钩子并返回一个蹦床,以便我可以轻松使用它?函数原型可能是:void* InstallHook(void* originalFunc, void* targetFunc, int jumpsize)
,或者我在网上阅读时理解的,但不确定jumpsize
将用于什么。
到目前为止我知道前5个字节必须保留和恢复,然后跳转到原始钩子函数的地址。所以我必须使用 malloc 来分配内存,memcpy 来复制字节,这0xE9
是跳转指令的值等等,但我只是不知道如何使用纯 C 来实现它。我认为它会是类似于这个问题中的代码。那么如何使用纯 C 为 WinAPI 函数编写一个返回蹦床的钩子函数呢?
scala - 为什么嵌套的 FlatMaps 会炸毁 Scala 中的堆栈?
通过阅读Rúnar Bjarnason的这篇论文Stackless Scala with Free Monad ,我正在学习 Scala 中的 Trampoline 技巧。但我陷入了第 4.3 节“容易出错的事情”。
有一件事让我感到困惑,a 如何在f(x)
给定 a 的情况下直接触发另一个内部调用FlatMap(x, f)
。这resume
已经是一个尾递归,所以它必须在一次resume
调用中发生。但是所有包装的函数都resume
应该产生一个 Trampoline 实例。所以我找不到堆栈仍然可能被炸毁的情况。
任何人都可以举一个例子来解释“极端情况”吗?谢谢。
==============
如果您还没有看过这篇很棒的论文,这是背景:
Scala 编译器只能在本地/最终尾位置自调用函数上应用TCO 。Trampoline
将堆栈转换为堆也是如此。所以在本文中,Trampoline
为不同的用途声明了三个实例。Done
用于包装最终结果。More
表示下一步计算。并FlatMap
表示下一步计算后还有一件事要做。所以在对它定义一个bind
操作之后,Trampoline
就变成了一个 Monad。请参阅下面的代码(来自论文):
```
```
一切对我来说都是有意义的,直到它说嵌套FlatMap
仍然可以炸毁堆栈。这就是我在这里问它的原因。
c - 如何区分 DLL 的 PE 标头中导入的函数和导入的全局变量?
我正在编写一个小工具,它应该能够检查感兴趣的任意进程并检查它的任何静态链接函数是否被蹦床。(蹦床的一个例子可能是Microsoft Detours对流程所做的事情。)
为此,我解析目标进程的PE 标头并检索其所有导入的 DLL,其中包含所有导入的函数。然后我可以比较磁盘上的 DLL 和目标进程内存中加载的 DLL:
A.Import Address Table
每个导入函数的条目。
B. 每个函数机器码的前 N 个字节。
如果以上任何一项不匹配,这肯定意味着 atrampoline
已应用于特定函数(或 WinAPI。)
这很好用,除了目标进程可以导入全局变量而不是函数的情况。例如_acmdln
是这样的全局变量。您仍然可以在其中找到msvcrt.dll
并使用它:
因此,这对我的蹦床检查工具意味着我需要区分导入函数 (WinAPI) 和全局变量。知道怎么做吗?
PS。如果我不这样做,我上面描述的算法将比较全局变量的“代码字节”,就像它是一个函数一样,它只是一个指向肯定会不同的命令行的指针,然后标记它作为蹦床功能。
PS2。不完全是我的代码,但可以在此处找到类似的解析 PE 标头的方法。(搜索用于DumpImports
提取 DLL 导入的函数。)