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

1

今日書かれている 4 番目の多くは、C にインスパイアされたフォーマットになっています。

古典的で (私が思うに) Forth をフォーマットする最も明確な方法は、対応するものまたは関連するものを揃えることです。

対応する部分が整列されていると、コードのウォークスルーが容易になり、独自の単語に引き出せる共通の要因が明らかになる場合があります。これは、私の第 4 暗号ライブラリからのスニペットです。

\ 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 ) は、必要に応じて別の単語に分割できる要素であることが簡単にわかります。

もう 1 つのスタイル ポイントは、次のように、先読み/解析語を左に揃えて、通常の後置語を右に揃えて配置することです。

: P@REL (         -- PadLast )                      FF CR1! DATA@ REL ;
: P!REL ( PadLast --         )                      FF CR1! DATA! REL ;
于 2015-02-25T01:23:22.303 に答える
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(2 番目の例を参照))、たとえば

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 に答える