2017-02-11 82 views
3

在Gforth中输入'a'时,字符的ASCII编号(将通过使用key字并按a将放入堆栈的编号相同)被放入堆栈。使用Gforth获取ASCII代码

这不起作用,例如与' '(空间)。相反:

' ' ok 
.s <1> 34384939008 ok 

数量“应该”是32如何解释这种现象?除了手动将相应于' '(空格)的ASCII码放在堆栈上之外,还可以做些什么呢?

回答

7

这个'a'语法对于Forth来说是相当新的。它是作为扩展名添加到传统语法之上的,它将所有内容解析为以空格分隔的令牌。所以'a'是一个原子标记,然后被解析为一个字符文字。

现在,' '不是原子标记,因为它包含空格字符。相反,它被解析为两个'令牌。它实际上是完全有效的Forth代码,因为'是一个Forth单词(叫做“tick”)。在你的例子中,第一个滴答作用在第二个。结果34384939008'的xt。

怎么办?获取字符的ASCII码的传统词是CHAR[CHAR]。第一个在解释模式下工作,第二个在编译模式下工作。 但是它们不适用于空格字符的特定情况,因为再次,所有空格都被解析掉。

但是,还有另一个字推动ASCII代码空间字符:BL

+0

哈哈,滴答不是一个深奥的词......尴尬;-)我刚从FORTH开始,错过了。 –

+0

只是一个问题:在运行时和编译模式下,有两个不同版本的'char'和'[char]'可能是什么原因? –

+2

在解释的代码中,只有'CHAR'是有意义的。 但是'CHAR'和'[CHAR]'在编译代码中很有用。 '[CHAR]'在编译时工作,所以它解析程序中的下一个单词。 'CHAR'在运行时工作,所以它不能在程序文本上运行,而是在稍后输入流。这可以在例如直接的话。 –