Nim编译JS报错:expression 'a'为int类型需使用或丢弃
Nim编译JS时"expression 'a' is of type 'int' and has to be used (or discarded)"错误修复
错误原因
Nim的proc参数默认是不可变绑定(let),无法在函数内部直接修改参数值。你的gcd函数中直接对参数a、b进行赋值操作,既违反了参数的不可变性,也让编译器误判原参数未被有效利用,从而抛出该错误。
解决方案
- 避免修改原始参数:在
gcd函数内部创建局部变量,复制参数值后再进行循环操作; - 修正冗余返回逻辑:原
return (b+a)-a完全多余,循环结束时x为0,gcd结果就是y; - 修复模逆函数的逻辑错误:原
find_mod_inverse循环中直接覆盖v1/v2/v3后赋值给u,会导致数据丢失,需先保存v的旧值再更新。
修正后的完整代码
import std/random import std/math randomize() proc gcd*(a: int, b: int): int = var x = a var y = b while x != 0: x, y = floorMod(y, x), x return y proc find_mod_inverse*(a: int, m: int): int = if gcd(a, m) != 1: return -1 var u1 = 1 u2 = 0 u3 = a v1 = 0 v2 = 1 v3 = m q = -1 while v3 != 0: q = floorDiv(u3, v3) # 先保存v的原始值,避免覆盖后丢失数据 let (old_v1, old_v2, old_v3) = (v1, v2, v3) v1 = u1 - q * old_v1 v2 = u2 - q * old_v2 v3 = u3 - q * old_v3 u1 = old_v1 u2 = old_v2 u3 = old_v3 return floorMod(u1, m)
补充说明
- 你之前尝试添加
discard a无效,因为核心问题不是参数未被使用,而是试图修改不可变参数,编译器提示有一定误导性; - 模逆函数的逻辑修正后,才能正确计算出模逆元,原代码的循环逻辑会导致计算结果错误。
内容的提问来源于stack exchange,提问作者A.K _ThePortal
相关产品推荐
相关产品推荐

