SML语法错误帮助

时间:2010-11-19 18:34:07

标签: syntax sml

在以下代码部分中,我收到错误,我不知道为什么我会使用我的所有资源来研究它们。这是SMLNJ编码。

compComm (DeallocComm(var, exp), env, ip, codes, contIP)=
 let val loc = lookupEnv var env;
  val codes1 = emitByte(LDC, ip, codes);
  val codes2 = emitByte(Arg loc, ip + 1, codes1);
  val (ip', codes3) = compExp(exp, env, ip+2, codes2);
  val codes4 = emitByte(ADEALLOC, ip', codes3);
   in(ip'+1, codes4, nil, contIP)
  end;

给出

hw4.sml:339.5-433.6错误:非构造函数应用于模式中的参数:DeallocComm hw4.sml:427.26-427.29错误:未绑定的变量或构造函数:var

hw4.sml:430.31-430.34错误:未绑定的变量或构造函数:exp

ADEALLOC => let val (n, stack') = popStack stack
 val (loc, stack'') = popStack stack';
 fun loop'(n, loc, store) =
  val store' = updateTable (loc, defaultIntValue, store);
  in loop'(n-1, loc+1, store) =
   val store'' = loop'(n, loc, store) end;
 in loop(ip+1, store'', stack'') end;

给出

hw4.sml:612.14错误:语法错误:插入EQUALOP

hw4.sml:615.8-615.11错误:语法错误:将VAL替换为END

对此有任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以将函数作为参数调用以传递给另一个函数,但是您执行的操作不正确。正确的语法是调用没有参数或perentheses的函数名,然后使用在函数体中作为参数传递的函数。

所以你希望你的函数声明是:

compComm (DeallocComm, env, ip, codes, contIP)=

然后在体内使用DeallocComm。就目前而言,您正在创建一个具有值但没有名称的环境变量 - DeallocComm(var,exp)在传递给函数之前评估

答案 1 :(得分:0)

所以对于第一个,我认为它找不到构造函数DeallocComm。 (从哪里宣布?)

对于第二个,它毫无意义。我不知道你在做什么。 store'store''loop'函数内或函数外吗?如果是前者,那么为什么不在let内?如果是后者,loop'的主体在哪里;你怎么能在最后的表达式中使用store'',这是在函数之外?此外,没有名为loop的值。您似乎缺少许多funlet和其他内容。