You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SML/NJ中main函数触发语法错误 原因排查与修复指导

SML/NJ成绩统计程序main函数语法错误说明

你遇到的deleting DO VAL、deleting VAL ID、SEMICOLON ID、deleting SEMICOLON END SEMICOLON类报错,都是解析器遇到不符合SML语法规则的代码时,尝试自动纠错恢复解析打出的日志,不需要按照报错字面意思删DO/VAL这类关键字,核心错误都在main函数的写法不符合SML的语法规则,具体问题如下:

  • 不存在var声明关键字:SML中默认绑定是不可变的,没有命令式语言的var变量声明语法。如果需要可修改的循环计数器,必须用ref声明可变引用,修改值用:=操作符,读取值用!操作符,直接写i = i + 1的写法在SML里是布尔判断表达式,不是赋值操作。
  • 列表下标访问语法错误:SML不支持列表名[索引]的下标访问写法,取列表第n位元素需要用标准库函数List.nth(列表, 索引),索引从0开始计数。
  • while循环结构语法错误:SML中while 条件 do后只能接单个表达式,要顺序执行多条逻辑必须用括号把所有逻辑包裹,表达式之间用;分隔,不需要额外写end标记结束while块,你代码里while块末尾和main函数末尾多写了两个多余的end。
  • print函数参数不符合要求:SML的print函数只接收单个字符串类型参数,不能直接传入整数、实数、字符串混合的多参数,需要先用对应类型转换函数(Int.toString转整数、Real.toString转实数)把所有值转成字符串,再用字符串拼接符^拼成单个字符串后传入打印。
修正后可运行的完整代码
val IDs = [410021001,410021002,410021003,410021004,410021005,410021006,410021007,410021008,410021009,410021010];
val Names = ["Alan","Bob","Carrie","David","Ethan","Frank","Gary","Helen","Igor","Jeff"]: string list;
val HW1 = [90.0,85.0,90.0,117.0,85.0,90.0,117.0,117.0,117.0,117.0] : real list;
val HW2 = [84.5,49.0,110.5,85.0,56.0,65.0,65.0,59.5,50.0,50.0] : real list;
val HW3 = [117.0,117.0,117.0,0.0,65.0,117.0,50.0,51.0,75.0,75.0] : real list;
val Midterm = [60.0,57.0,6.0,44.0,72.0,43.0,54.0,75.0,53.0,75.0] : real list;
val Final = [66.0,64.0,62.0,55.0,66.0,75.0,75.0,75.0,75.0,75.0] : real list;


fun score(HW1, HW2, HW3, Midterm, Final) =
    round(HW1 * 0.1 + HW2 * 0.1 + HW3 * 0.1 + Midterm * 0.3 + Final * 0.4);


fun letterGrade(score) =
    if score >= 90 then "A+"
    else if score >= 85 then "A"
    else if score >= 80 then "A-"
    else if score >= 77 then "B+"
    else if score >= 73 then "B"
    else if score >= 70 then "B-"
    else if score >= 67 then "C+"
    else if score >= 63 then "C"
    else if score >= 60 then "C-"
    else if score >= 50 then "D"
    else "E";

val i = ref 0
val max = length(IDs)
fun main() = 
    while !i < max do (
        let
            val current_hw1 = List.nth(HW1, !i)
            val current_hw2 = List.nth(HW2, !i)
            val current_hw3 = List.nth(HW3, !i)
            val current_mid = List.nth(Midterm, !i)
            val current_final = List.nth(Final, !i)
            val ind_score = score(current_hw1, current_hw2, current_hw3, current_mid, current_final)
            val grade = letterGrade(ind_score)
        in
            print(Int.toString(List.nth(IDs, !i)) ^ "    " 
                  ^ List.nth(Names, !i) ^ "    " 
                  ^ Int.toString(ind_score) ^ "    " 
                  ^ grade ^ "\n");
            i := !i + 1
        end
    )

代码加载到SML/NJ后,执行main();即可运行打印所有学生的成绩结果。

内容的提问来源于stack exchange,提问作者Sifiso Lucolo Dhlamini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:33:36