如何在Gforth中获取单词的字符串表示并放入数据栈?
Gforth中捕获
see输出为字符串的方案 临时文件中转法
利用系统临时文件重定向see的输出,再将文件内容读入字符串:: see-to-string ( addr u -- addr u ) s" /tmp/see-temp.txt" value temp-path temp-path w/o create-file throw \ 创建临时文件 save-out temp-path stream throw \ 重定向输出到文件 see \ 执行see命令 restore-out \ 恢复原输出流 temp-path r/o open-file throw read-file throw \ 读取文件内容 temp-path delete-file throw \ 删除临时文件 ;使用示例:
s" +" see-to-string type,会打印+的定义字符串。注意临时路径需保证有读写权限,可根据系统调整。内存缓冲区重定向法
替换see使用的输出流到内存缓冲区,直接捕获输出:buffer: see-buf 2048 allot \ 定义足够大的缓冲区 : capture-see ( addr u -- addr u ) save-out see-buf 2048 stream throw \ 切换输出到缓冲区 see \ 执行see restore-out \ 恢复原输出 see-buf count \ 返回缓冲区中的有效字符串 ;注意:部分Gforth版本中
see可能直接调用终端输出而非标准流,这种情况下该方法会失效,需测试验证。手动解析代码字段法
借助seecol等底层工具,自己解析单词的执行令牌(xt)并拼接成类似see的输出字符串:: parse-def ( xt -- addr u ) create def-buf 2048 allot def-buf 2048 >r xt >body begin \ 遍历代码字段 dup @ dup 0= if drop exit then \ 解析当前代码单元,转换为对应单词名或操作码 dup find-name if type else . then \ 简化示例,需完善格式 s" " type \ 分隔符 cell+ again def-buf count ;这个方法需要熟悉Gforth的内部词法结构,不同版本的代码字段格式可能不同,适合需要高度自定义输出的场景。
内容的提问来源于stack exchange,提问作者Bots Fab
相关产品推荐
相关产品推荐

