返回入门教程首页 主页 | 开发工具 | 应用芯片 | 核心模块  
 
   
 

Win32Forth

数的转换

介绍

Forth 解释器的任务之一就是在字典中查找字。如果一个字不在字典中,解释器就把这个字转换成一个数值并放到堆栈上。 Win32Forth 有一个简单但是有效的数值转换系统,它允许可插入的字用于数值转换。有几个数值转换系统是随着安装系统一同提供的。

标准的数值转换

Standard numbers double numbers ( 基数为 2 到 36) 得到支持,每一类数值的最大值在 ENVIRON.F ( 环境字集 ) 中指定。数值前面的负号 (-) 是可选的。 Floating point numbers 只支持以 10 为基的格式。

扩展数值

Win32Forth 支持扩展数值,它们在常见的 Forth 系统如 gforth 中使用。

数基修饰符 % & $

二进制 % 修饰符 (在任何的数基中)

在任何数基中,可以使用一个 % 前缀符号输入二进制数,一个可选的负号 (-) 可以在 % 之前或之后。下面是一些合法的二进制数和它们等效的十进制值。

%0 (0)
%10101 (21)
-%01 (-1)
%-101 (-5)

十进制修饰符(在任何的数基中)

在任何数基中,可以使用一个 & 前缀符号输入十进制数,一个可选的负号 (-) 可以在 & 之前或之后。下面是一些合法的十进制值。

&193
&-22
-&35

十六进制 $修饰增(在任何的数基中)

在任何数基中,可以使用一个 $ 前缀符号输入十六进制数,一个可选的负号 (-) 可以在 $ 之前或之后。下面是一些合法的十六进制数和它们等效的十进制值。

0x123 (291)
FFFFFFFFh (-1)
-245h (-581)
-0x34 (-52)
0x-34 (-52)

浮点数(在任何的数基中)

在任何数基中,浮点数可以通过前缀字 F# 指定(不是一个引导串,而是一个单独的字)。例如:

F# 1.0e-2

带点的 IP地址表示 (a.b.c.d)

格式为 a.b.c.d 的 IP 地址可以在任何数基中输入,但是它们不能是有符号的数,也不能够带有前缀数基修饰符 ( 比如 %, $ or & )

加入您自己的转换字

基于链表的数值转换技术能够很容易地扩展成支持其它格式的数值转换。

Win32Forth 使用 chains 链表提供一个可插入的数值转换系统。数值转换链表称为 number?-chain 。 链表中的每个数值转换子程序都会收到一个串 ( addr len ) 并试图转换成数值。如果转换失败,这个字可以执行 -1 THROW 指示它不能转换这个串,则链表中的下一个字试图转换,直到链表中的全部字都测试完成。如果链表结束,则会执行 -13 THROW ( 信息是:没有定义 ) 。

如果转换成功,则必须返回一个双精度数。如果这个数真的是一个双精度数,则设置 DOUBLE? 标志为真,否则数值被视为一个单精度数,高位单元被忽略。对于有十进制小数点的数值,值 DP-LOCATION 被设置以指示小数点在输入串中的位置。如果需要,标志 -VE-NUM? 可以设置为真,数值在使用之前将取负。这可以避免在每个子程序中都保持负号检测到标志。

浮点数在浮点堆栈中返回,没有返回值,变量 FLOAT? 被设置。参看 FLOAT.F 得到详细信息。 注意 - 即使是浮点值也必须返回一个双精度的数,在 FLOAT? 设置时,这个值被忽略。

任何堆栈转换字的堆栈效果必须是 ( addr len -- d ) 这里 addr len 是输入串, d 是双精度数值输出。如果您不能够转换输入串,则执行 -1 THROW 。为了安装转换子程序,您必须说明

number?-chain chain-add <your-number-conversion-word>

这可以把您的字加入到链表的末尾。您的字将在内建的数值转换子程序执行之后被调用。为了在任何的标准字之前执行,指定

number?-chain chain-add-before <your-number-conversion-word>

 

 
   

(C) ForthChina.com 版权所有 2004-2010
Email:forthchina@163.com