Raku中如何定义裸词操作符?骰子记法实现遇阻
在Raku中定义裸词中缀操作符实现骰子记法
Raku支持定义裸词操作符,你之前的写法无法生效是因为混淆了符号中缀操作符和裸词中缀操作符的定义逻辑。
问题根源
你用sub infix:<d>定义的是命名符号中缀操作符,它的唯一标识是<d>,而非裸词d。因此直接写2 d 10时,编译器会将d视为普通标识符(变量或子例程名),而非操作符。
正确实现方法
要让裸词d成为中缀操作符,需使用is infix trait标记子例程,将其注册为裸词中缀操作符:
sub d(Int $x, Int $y) is infix { (1..$y).roll($x) }
现在你可以直接用2 d 10调用该操作符,编译器会正确识别为中缀运算。
可选:调整操作符优先级
如果需要让骰子操作的优先级高于加法等常规运算(符合骰子记法的预期),可通过is tighter trait调整:
sub d(Int $x, Int $y) is infix is tighter(&infix:<+>) { (1..$y).roll($x) }
此时2 d 10 + 5会先计算骰子结果,再执行加法,避免运算顺序错误。
REPL测试验证
在Raku REPL中输入上述代码后,可直接测试:
> 2 d 10 # 输出示例:(5 9) (随机生成的两个1-10之间的数) > sum(2 d 10) # 输出上述两个数的和
内容的提问来源于stack exchange,提问作者Atlas Sullivan
相关产品推荐
相关产品推荐

