forth - 如何在Forth中输入数字

标签 forth

在Basic中是否有类似Basic中的input或C语言中的scanf("%d")的东西?

大概是这样的:

200 buffer: buf
: input ( -- n ) buf 200 accept 
  some-magic-filter
  buf swap evaluate ;

上面的代码中的问题是,如何定义仅传递数字而不传递任何单词,定义等的过滤器?

最佳答案

该标准仅指定一个低级 >NUMBER 词来解释整数。
OTOH使用EVALUATE将字符串转换为数字是一种快速而肮脏的方法。要么不检查就使用它(在可信输入的情况下),或者根本不使用它。尝试在EVALUATE之前过滤字符串是一个坏主意:它具有>NUMBER单词本身的成本和较低的重用因子。

注意: >NUMBEREVALUATE均未检测到数字溢出。

无论如何,您输入单单元整数的单词可以定义为:

: accept-number ( -- n )
  PAD DUP 80 ACCEPT ( addr u ) StoN ( n )
;

对于受信任的输入,您可以像这样定义StoN
: StoN ( addr u -- x )
  STATE @ ABORT" This naive StoN should not be used in compilation state"
  DEPTH 2- >R
    EVALUATE
  DEPTH 1- R> <> IF -24 THROW THEN
  \ check depth to accept the single-cell numbers only
;

否则(在输入不受信任的情况下),您有两种选择:依靠特定Forth系统的特定单词或使用某些(也许是您自己的)库。

我使用以下词典来定义StoN:
\ ---
\ The words from Substring Matching library
\ (where length is counted in address units)

: MATCH-HEAD ( a u a-key u-key -- a-right u-right true | a u false ) 
  2 PICK OVER U< IF  2DROP FALSE EXIT THEN 
  DUP >R
  3 PICK R@ COMPARE IF  RDROP FALSE EXIT THEN 
  SWAP R@ + SWAP R> - TRUE
; 

\ ---
\ The words from Literals interpreting library
\ (where prefix 'I-' is shortcut for Interpret)

: I-DLIT ( a u -- x x true | a u false ) 
  2DUP S" -"  MATCH-HEAD >R
  DUP 0= IF  NIP RDROP EXIT THEN 
  0 0 2SWAP >NUMBER NIP IF  RDROP 2DROP FALSE EXIT THEN 
  R> IF  DNEGATE THEN  2SWAP 2DROP TRUE
; 

: I-LIT ( a u -- x true | a u false ) 
  I-DLIT IF  D>S TRUE EXIT THEN  FALSE
;

之后,StoN可以定义为:
: StoN ( a u -- x ) I-LIT IF EXIT THEN -24 THROW ;

可以在GitHub上找到提到的库:
  • Substring matching functions
  • Resolvers示例(适用于各种词素)
  • 关于forth - 如何在Forth中输入数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51704398/

    相关文章:

    recursion - 第四,Hofstadter Q 序列的递归

    integer-arithmetic - Forth 中两个 double 整数相除

    compiler-construction - 在没有 Gforth 的情况下编译 Gforth?

    embedded - 从哪个 Forth 开始移植?

    forth - Forth LEAVE ... LOOP 是如何实现的,因为事先不知道 LEAVE 的数量?

    forth - 如何在 Forth 系统中正确实现 POSTPONE?

    forth - "local variable"在 Forth 编程语言中是什么意思?

    programming-languages - 用汇编语言实现的编程语言

    windows - 如何在 GForth (GNU Forth) 的文件名中包含空格?

    forth - 用 'see' 反汇编 Forth 码字