3

我正在尝试通过 Project Euler 练习来自学 Forth。我查看了几个教程,但我找不到任何关于如何定位关键字/控制结构的明确指南。Emacsforth-mode似乎对代码应该如何格式化有一些想法,但我对我所看到的并不真正相信:) 所以,例如,下面的代码:

: euler1
    0 1000 0
    do i dup 3 mod -rot 5 mod -rot -rot * 0=
        if i + then
    loop ;

这样格式化有意义吗?你把条件放在哪里了?如果有任何类型的样式指南/示例集合,您认为格式正确,您能否请我参考那个示例?

4

3 回答 3

2

作为初学者,请帮自己一个忙,并彻底注释您的代码,例如:

1       : euler1        ( -- n )
2               0               ( n )
3               1000 0          ( n HI-limit LO-index )
4               DO              ( n )
5                       I DUP   ( n i i )
6                       3 MOD   ( n i mod3 )
7                       -ROT    ( mod3 n i )
8                       5 MOD   ( mod3 n mod5 )
9                       -ROT    ( mod5 mod3 n )
10                      -ROT    ( n mod5 mod3 )
11                      *       ( n mod5*mod3 )
12                      0=      ( n flag )
13                      IF
14                              i +     ( n+i )
15                      THEN
16              LOOP
17      ;

你会看到:

  1. 在第 9,10 行 -ROT -ROT 可以用简单的 ROT 恢复
  2. 没有必要使用 ROT -ROT 来处理数据堆栈上的 3 个项目,可以简单地使用 SWAP,例如:3 MOD SWAP 5 MOD
  3. 更多但你可以避免堆栈杂耍和写: I 3 MOD I 5 MOD

我会这样写:

: div?          ( a b -- f  ; b DIVIDES a ? )
        mod 0=
;
: euler1.1      ( -- n )
        0
        1000 0
        DO      ( n )
                I 3 div? I 5 div? OR
                IF
                        I +
                THEN
        LOOP
;
于 2013-08-06T13:01:33.517 回答
1

如果您的意思是在空格应该去哪里的意义上进行格式化,那么您的示例似乎很合理;循环和单词的缩进使代码对于更习惯于需要缩进或括号的语言的人来说相当易读。

我的风格偏好更像下面的代码,但我不确定你的代码在做什么,所以我可能以一种不完全合理的方式安排它。一般来说,我会将条件的条件与关键字一起放在新行上,如果条件复杂,我会将其分解为自己的单词(add-i?如下)。

: add-i?
    dup 3 mod -rot 5 mod -rot -rot * 0= ;

: euler1
    0 
    1000 0 do
        i add-i? if 
            i + 
        then
    loop ;

将条件块或循环的起始关键字放在第一行的末尾可能有点不直观,但我认为它是一种视觉提示,类似于 Python 使用 a:进入缩进区域(或Visual Basic 如何使用Then(参见第二个示例)),例如

if true:
    print("True")

thens 和s 相当于在Visual Basicloop中关闭大括号或关键字,例如End If

 If True Then
     MsgBox "True"
 End If

(这是一个稍微令人困惑的例子,因为 Then 的使用与 Forth 中的使用不同)

于 2013-08-04T17:27:04.983 回答
1

今天写的很多第四篇文章都有 C 启发的格式。

格式化 Forth 的经典且(我认为)最清晰的方法是对齐相应或相关的事物。

当相应的部分对齐时,代码更容易遍历,并且可能会暴露出一个可以提取到自己的单词中的共同因素。这是我的第四加密库中的一个片段。

\ RSA Digital Signature ( Notice the spacing )
 : signat (   addr-c # -- s )  djb2a      pub-key N rsa   ;
 : verify ( s addr-c # -- f )  djb2a swap prv-key N rsa = ;

现在很容易看出 ( N rsa ) 是一个可以根据需要分解为另一个词的因素。

另一个风格点是,前瞻/解析词应该向左对齐,常规后缀词应该向右对齐,如下所示:

: P@REL (         -- PadLast )                      FF CR1! DATA@ REL ;
: P!REL ( PadLast --         )                      FF CR1! DATA! REL ;
于 2015-02-25T01:23:22.303 回答