【发布时间】:2023-03-06 11:25:01
【问题描述】:
type VAR = identifier
type code = instruction list
type environment = identifier list
type EXPR = environment -> code * environment
fun ADD_OP expr expr' env = DUMMY
fun SUB_OP expr expr' env = DUMMY
fun MUL_OP expr expr' env = DUMMY
fun DIV_OP expr expr' env = DUMMY
fun MOD_OP expr expr' env = DUMMY
fun NUM n env = ([I_Int n],env)
我想在这里写一个延续函数。该代码是设计用于执行机器指令的较大代码的一部分。该代码的作用是将抽象语法代码翻译成机器代码。下面是一组机器码指令,它从堆栈中取出两个操作数执行操作并将结果压入堆栈
I_Add
I_Mod
I_Sub
I_Div
同时
I_Int
将整数值压入堆栈。当代码在堆栈上找不到所需的操作数时,会在尝试执行指令时发出中止信号。假设您正在执行 I_Add,那么堆栈上必须有两个操作数,否则它将发出中止信号。
直到知道我只为 I_Int 操作编写了正确的代码
fun NUM n env = ([I_Int n],env)
此代码将整数 n 压入堆栈。我知道这里的策略是先执行“expr”和“expr'”,然后将指令添加到列表中 我试图用下面的方式为此编写代码
fun ADD_OP expr expr' env = expr env
(fn ((c,_),env) => expr' env
(fn ((c',_),env) => ((c::c'::[I_Add]),env)))
但这会导致类型不匹配错误
Error: value type in structure doesn't match signature spec
name: ADD_OP
spec: ?.EXPR -> ?.EXPR -> ?.EXPR
actual: ('a -> ('b * 'c -> Machine.Code.instruction list * 'c) -> 'd)
-> 'e -> 'a -> 'd
请有人指出如何解决此错误的正确方向。我知道我的方法是正确的,但我不明白延续。我正在尝试这个超过 2 天,但无法解决这个问题。如果有人知道任何关于如何在 SML 中编写 contiuations 的教程也会有所帮助。
【问题讨论】:
-
你能把
instruction的定义也包括进来吗?
标签: sml smlnj continuations