我按照本指南从Nim开始写一个brainfuck解释器:[http://howistart.org/posts/nim/1/][1]
一切正常,但编译包含警告:
错误:不推荐使用readChar
谷歌搜索该消息(在引号中)没有给我打击。是否有替代readChar? 如果没有,相同功能的最简单替代是什么? (最好来自标准的lib)。
它使用的代码是:
proc run(skip = false): bool =
while tapePos >= 0 and codePos < code.len:
if tapePos >= tape.len:
tape.add '\0'
if code[codePos] == '[':
inc codePos
let oldPos = codePos
while run(tape[tapePos] == '\0'):
codePos = oldPos
elif code[codePos] == ']':
return tape[tapePos] != '\0'
elif not skip:
case code[codePos]
of '+': inc tape[tapePos]
of '-': dec tape[tapePos]
of '>': inc tapePos
of '<': dec tapePos
of '.': stdout.write tape[tapePos]
of ',': tape[tapePos] = stdin.readChar
else: discard
inc codePos
答案 0 :(得分:1)
以下是如何使用readChars
来实现相同的语义(未经测试但应该有效):
proc run(skip = false): bool =
while tapePos >= 0 and codePos < code.len:
if tapePos >= tape.len:
tape.add '\0'
if code[codePos] == '[':
inc codePos
let oldPos = codePos
while run(tape[tapePos] == '\0'):
codePos = oldPos
elif code[codePos] == ']':
return tape[tapePos] != '\0'
elif not skip:
case code[codePos]
of '+': inc tape[tapePos]
of '-': dec tape[tapePos]
of '>': inc tapePos
of '<': dec tapePos
of '.': stdout.write tape[tapePos]
of ',': discard stdin.readChars(tape, tapePos, 1)
else: discard
inc codePos
有关不推荐使用此内容的背景信息,请参阅我的评论here
答案 1 :(得分:0)
Nim文档建议使用readBuffer。
proc readBuffer(f:File; buffer:pointer; len:Natural):int {..}
将len个字节读入缓冲区指向的缓冲区。返回 已读取的实际字节数可能小于len (如果没有剩余的字节数),但不能更大。