小队:第8筹码

2021-02-19 16:25:34

Squad是在SCHIP虚拟机上运行的Forth解释器。按照传统,它将本主机的8位操作扩展到16位“单元”,这也使指针可以轻松地在堆栈上传输和操作。参数堆栈和返回堆栈每个可以容纳32个单元,并且在启动时会为用户定义提供1kb以上的可用空间。

尽管由于空间限制,内置词典中缺少许多细节,但Squad是一个相当完善的Forth环境,具有常规的内部和外部解释器,立即数单词和可变的返回堆栈。

字典条目由指向上一个条目(或根条目为0)的指针," type"组成。单元格(请参见“类型”),以高字节来区分立即词,以低字节来区分词类(单词的名称为字符串)(请参见“名称”)。 )和单词本身的主体(请参见"> body")。字符串用自定义编码表示,其中每个字符是一个字节,字符串以字节0xFF终止。格式正确的字符应为5的倍数,并表示以下字母的索引:

外部解释器将一次提示用户输入令牌,然后根据" mode"将其附加到当前定义或执行它。每当文本以倒置的背景绘制时,它都是未决的输入。按右箭头或空格将确认选择,而向上和向下箭头在可用选项之间循环。

首先,外部解释器将要求用户在几个粗略类别之间进行选择-一个数字(#)或六个词类别之一,下面将详细介绍。数字始终以16位十六进制显示。向上和向下箭头将递增或递减数字,而2和X将一次将数值递增或递减256,以简化输入指针和大值的操作。如果曾经提示用户输入以前未使用过的单词名称(请参见" name"),则可以通过选择空格字符来终止输入(该字符将确认名称,但最多包含空格),或按空格键(这将确认名称,直到并包括当前待处理的字符)。输入新名称的同时按Q将备份一个字符。

在外部解释器的最高级别,用户也可以按“ Z”,这是输入" .s&#34 ;;的简写。它将在新行上打印参数堆栈的当前内容,而无需对其进行修改。

:fib 0 1循环dup。交换+ dup 100>直到 ;

以下单词列表包括括号中的堆栈效果。 &#34左侧的名称; - " 符号是输入参数,底部到顶部,右侧的名称是结果,如果有的话,底部到上。 发出(char - )打印一个字符到终端。 " char&#34的高字节; 被忽略了。 擦除( - )从终端输出电流线上打印单个字符。 键入(str - )给定字符串(如上所述),将其打印到终端。 名称( - )提示用户输入新单词名称的字符串,将此字符串附加到"此处&#34 ;. Word(类型 - XT)提示用户选择现有字的名称。 如果"类型" 是0,任何单词。 否则,它应该是其中一个类别的类型代码。 令牌( - x标志)提示用户令牌,如外翻翻译。 如果"旗帜" 是0," x" 是一个数字。 否则' s字典条目(" xt")。

over(x y-x y x)复制参数堆栈上的第二项。 swap(x y-y x)交换参数堆栈上的前两项。 r> (| x-x |)将项目从参数堆栈移到返回堆栈。 > r(x |-| x)将项目从返回堆栈移到参数堆栈。 C! (x addr-)将一个8位值(x的低字节)写入" addr"。 这里(-addr)一个变量,它包含内存的第一个可用单元的地址。 head(-addr)一个包含最新字典条目的xt的变量。

模式(-addr)一个在解释期间包含0或在编译期间包含1的变量。 ,ret(-)将出口附加到当前定义。 如果退出是在线程代码子例程调用之后,则该字执行尾部调用消除。 ,lit(x-)将文字(按数字)追加到当前定义。 ,jump(addr-)将无条件分支附加到当前定义的addr处的线程代码中。 ,jump0(addr-)将条件分支(如果参数堆栈的顶部为0则附加一个分支)到当前定义的addr的线程代码中。 ,call(xt-)将子例程调用附加到当前定义。 无论所提供的xt是  native",此字词都会做对的事情 (内置)或线程代码子例程。 > type(xt-n)给定字典条目,获取其类别。 高字节是立即标记,低字节是类别类型代码。

给定字典条目的> name(xt-str),获取其名称的地址(适合" type")。 > body(xt-addr)给定字典条目,获取其主体开始的地址。 创建(-)提示输入名称,并使用该名称创建新的词典条目。 exec(xt-)给定字典条目,执行单词。 与",call"对应的解释。 循环...(再次|直到|循环):基本的无限循环和条件循环。 直到并且同时消耗一个布尔标志。 :imm(-)提示输入新名称,然后开始定义立即词。 与":"相对。 :(-)提示输入新名称,然后开始定义一个普通单词。

[((-)切换到口译。 与"]"一起使用 和&#34 ;,点亮" 例如,预先评估常量表达式。 忘记(-)提示输入单词名称,并销毁该词典条目以及所有以后的定义。 如果将解释器应用于Squad的内部组件,则确实可以使您的解释器无法理解。 :1 + 1 +; (x-y) :imm引用0字; (-xt)