【发布时间】:2017-02-11 04:19:44
【问题描述】:
当在 Gforth 中输入 'a' 时,字符的 ASCII 数字(与使用 key 字并按 a 将放入堆栈的数字相同)被放入堆栈。
这不适用于例如' '(空格)。而是:
' ' ok
.s <1> 34384939008 ok
数字“应该”是 32。什么解释了这种行为?除了手动将与' '(空格)对应的ASCII码放入堆栈之外,还能做些什么呢?
【问题讨论】:
当在 Gforth 中输入 'a' 时,字符的 ASCII 数字(与使用 key 字并按 a 将放入堆栈的数字相同)被放入堆栈。
这不适用于例如' '(空格)。而是:
' ' ok
.s <1> 34384939008 ok
数字“应该”是 32。什么解释了这种行为?除了手动将与' '(空格)对应的ASCII码放入堆栈之外,还能做些什么呢?
【问题讨论】:
'a' 语法对于 Forth 来说是相当新的。它被添加为传统语法之上的扩展,将所有内容解析为空格分隔的标记。所以'a' 是一个原子标记,然后被解析为字符文字。
现在,' ' 不是原子标记,因为它包含一个空格字符。相反,它被解析为两个' 标记。它实际上是完全有效的 Forth 代码,因为 ' is a Forth word (called "tick")。在您的示例中,第一个刻度对第二个起作用。结果34384939008 是' 的xt。
该怎么做呢?获取字符 ASCII 码的传统单词是 CHAR 或 [CHAR]。第一个在解释模式下工作,第二个在编译模式下工作。 但是它们不适用于空格字符的特殊情况,因为同样,所有空格都会被解析掉。
但是,还有另一个词推动了 ASCII 码空格字符:BL。
【讨论】:
char和[char]有两个不同的版本可能是什么原因?
CHAR 是有意义的。但是CHAR 和[CHAR] 在编译后的代码中都很有用。 [CHAR] 在编译时工作,因此它解析程序中的下一个单词。 CHAR 在运行时工作,因此它不对程序文本进行操作,而是在稍后的时间处理输入流。这可以很方便,例如直接的话。