Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nim lang 尼姆:';readChar已弃用';。用什么来代替?_Nim Lang - Fatal编程技术网

Nim lang 尼姆:';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 >=

我遵循本指南,从Nim开始编写brainfuck解释器:[

这一切都很好,但汇编中包含一个警告:

错误:readChar已弃用

在谷歌上搜索这条信息(用引号)不会给我任何点击率。readChar有没有替代品? 如果不是,那么最容易替换相同功能的是什么?(最好是从标准库中)

它所使用的代码是:

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