Nim lang 尼姆:';readChar已弃用';。用什么来代替?
我遵循本指南,从Nim开始编写brainfuck解释器:[ 这一切都很好,但汇编中包含一个警告: 错误:readChar已弃用 在谷歌上搜索这条信息(用引号)不会给我任何点击率。readChar有没有替代品? 如果不是,那么最容易替换相同功能的是什么?(最好是从标准库中) 它所使用的代码是:Nim lang 尼姆:';readChar已弃用';。用什么来代替?,nim-lang,Nim Lang,我遵循本指南,从Nim开始编写brainfuck解释器:[ 这一切都很好,但汇编中包含一个警告: 错误:readChar已弃用 在谷歌上搜索这条信息(用引号)不会给我任何点击率。readChar有没有替代品? 如果不是,那么最容易替换相同功能的是什么?(最好是从标准库中) 它所使用的代码是: proc run(skip = false): bool = while tapePos >= 0 and codePos < code.len: if tapePos >=
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
proc run(skip=false):bool=
当tapePos>=0和codePos=tape.len:
磁带。添加“\0”
如果代码[codePos]='[':
codePos公司
让oldPos=codePos
运行时(磁带[tapePos]='\0'):
codePos=oldPos
elif代码[codePos]==']':
返回磁带[tapePos]!='\0'
如果不跳过:
案例代码[codePos]
“+”:inc磁带[tapePos]
“-”:十二月磁带[tapePos]
“>”的名称:inc tapePos
Nim文档中的一部分建议使用readBuffer
proc readBuffer(f:File;buffer:pointer;len:Natural):int{..}
将len字节读入缓冲区指向的缓冲区。返回
已读取的实际字节数可能小于len
(如果没有剩余的字节那么多),但不会超过
下面是如何使用readChars
实现相同的语义(未经测试,但应该可以工作):
proc run(skip=false):bool=
当tapePos>=0和codePos=tape.len:
磁带。添加“\0”
如果代码[codePos]='[':
codePos公司
让oldPos=codePos
运行时(磁带[tapePos]='\0'):
codePos=oldPos
elif代码[codePos]==']':
返回磁带[tapePos]!='\0'
如果不跳过:
案例代码[codePos]
“+”:inc磁带[tapePos]
“-”:十二月磁带[tapePos]
“>”的名称:inc tapePos
当然,但是readBuffer将一个文件作为输入参数,那么它是如何做的呢?readBuffer将一个文件
,而stdin是一个文件
。这不是一个好的选择,因为它需要一个指针
,而且@Yobmod注意到它与readChar
并不匹配。不幸的是,它没有他被弃用了,弃用的原因是readChar
速度很慢,但实际上没有其他选择。你可以在这里看到我与Nim的创建者关于这一点的讨论:我尝试了这一点,但得到了Error:expression,但找到了关键字discard
。删除discard会导致类型不匹配get(int)但预期char=char
。我尝试将tapePos转换为char,但出现了不同类型的错误。hrm,你能简要说明你的代码(或将其粘贴到某个地方)吗?啊,我仍然有“tape[tapePos]=”。删除该选项修复了问题。谢谢!@Yobmod看起来你已经激发了一个变化:)
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