为帖子的奇怪标题道歉,我不确定描述它的最佳方式是什么。
一般问题:
对 Seq.map (或类似函数)进行顺序应用,除了列表中的每一项外,还传入一个“上下文”。每次迭代都可以修改这个“上下文”,更新后的版本应该传递到列表中的下一项。
具体问题:
我正在 F# 中创建一个编译器。我目前正在进行的步骤是将基于堆栈的 IL 转换为基于寄存器的 IL。我在想我可以“遍历”基于堆栈的 IL 并携带当前的“eval 堆栈”(类似于 .NET 的 eval 堆栈)。显然,每个堆栈 IL 操作码都会改变堆栈(例如:“添加”操作码将两个项目从堆栈中弹出并推送结果)。这个更新的堆栈将被传递到下一个操作码的发射周期。
请注意,我对函数式编程非常陌生(我是在一周前了解到的),来自 C# 背景,我的主要问题是“什么是‘函数式’方法来做到这一点?”
这是我对“功能”方法的最佳猜测(伪代码)。我不喜欢“transformStackToRegisterIL”的元组返回值,如果我想保持不可变值的标准,是否需要它?另外,我担心过长的 IL 块会导致堆栈溢出,这是我的担忧吗?
let rec translate evalStack inputIl =
match inputIl with
| singleOpcode :: tail ->
let (transformed, newEvalStack) = transformStackToRegisterIL evalStack singleOpcode
transformed :: translate newEvalStack tail
| [] -> []
编辑:List.scan是我想要的内置功能吗?(看起来很相似,但并不完全正确......但它可能是正确的,我不确定)