Nim编译时生成雨滴音效查找表的特殊情况及汇编疑问
关于Nim语言雨滴音效题解法的两个疑问
我并非Nim语言使用者,看到Exercism平台上雨滴音效转换题的一则Nim解法时感到惊讶。该题目要求如下:
- 若数字能被3整除,结果添加"Pling"
- 若能被5整除,添加"Plang"
- 若能被7整除,添加"Plong"
- 若均不满足,结果为数字的字符串形式
对应的Nim代码如下:
const lookup = block: const raindrops = [ (3, "Pling"), (5, "Plang"), (7, "Plong"), ] func calcPeriod(a: openArray[(int, string)]): int = result = 1 for item in a: result *= item[0] func genLookup: array[calcPeriod(raindrops), string] = for i, s in result.mpairs(): for (n, sound) in raindrops: if i mod n == 0: s.add sound if s.len == 0: s = $i genLookup() proc convert*(n: int): string = lookup[n mod lookup.len]
我理解lookup是在编译时生成的查找表,convert函数仅在运行时通过取模索引表项。但我有两点疑惑:
- 对于非3、5、7倍数的数字,需转为字符串,这一操作本应是运行时逻辑,编译时如何预先生成对应的表项?
- 将代码上传至Compiler Explorer查看汇编时,未发现查找表、相关字符串及
convert函数的痕迹,想了解其中原因。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

