首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >第四代码格式指南

第四代码格式指南
EN

Stack Overflow用户
提问于 2013-08-03 14:19:31
回答 3查看 758关注 0票数 3

我正试图通过做欧拉项目练习来教自己。我已经研究过几个教程,但是我没有找到任何关于如何定位关键字/控制结构的明确指南。Emacs forth-mode似乎对如何对代码进行格式化有所了解,但我并不完全相信我所看到的内容:),例如,下面的代码:

代码语言:javascript
复制
: euler1
    0 1000 0
    do i dup 3 mod -rot 5 mod -rot -rot * 0=
        if i + then
    loop ;

用这种方式格式化它有意义吗?你把条件放哪儿了?如果有任何样式指南/示例集合,您认为它们的格式是正确的,那么请您给我参考一下这个示例好吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-04 17:27:04

如果您的意思是按照空格的位置设置格式,那么您的示例看起来相当合理;循环和单词的缩进使代码对于更习惯于需要缩进或括号的语言的人来说相当容易读。

我的风格偏好会更像下面的代码,但我不知道你的代码是做什么的,所以我可能已经安排它的方式没有完美的意义。通常,我会将条件的条件与关键字一起放在新行上,如果条件很复杂,我会将其输入到自己的单词中(下面是add-i?)。

代码语言:javascript
复制
: add-i?
    dup 3 mod -rot 5 mod -rot -rot * 0= ;

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

在第一行末尾使用条件块或循环的起始关键字可能有点不直观,但我认为它类似于Python使用:进入缩进区域的方式(或者visual如何使用Then (见第二个示例))。

代码语言:javascript
复制
if true:
    print("True")

thens和loops相当于关闭花括号或关键字,如Visual中的End If

代码语言:javascript
复制
 If True Then
     MsgBox "True"
 End If

(这是一个稍微令人费解的例子,因为当时的使用与Forth中的使用有所不同)

票数 1
EN

Stack Overflow用户

发布于 2013-08-06 13:01:33

作为初学者,请帮自己一个忙,并对您的代码进行彻底的评论,比如:

代码语言:javascript
复制
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项,只需简单地使用交换:3 MOD交换5 MOD。
  3. 更多的是,您可以避免堆栈杂耍和写入:I3MODI5MOD

我会这样写:

代码语言:javascript
复制
: 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
;
票数 2
EN

Stack Overflow用户

发布于 2015-02-25 01:23:22

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

经典的,也是(我认为)最清晰的格式化Forth的方法是对齐相应的或相关的东西。

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

代码语言:javascript
复制
\ 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 = ;

现在很容易看到( easy )是一个因素,可以分解为另一个词,如果需要。

另一个风格点是,查找/解析单词应该向左平放,而常规后缀词应该向右平放,如下所示:

代码语言:javascript
复制
: P@REL (         -- PadLast )                      FF CR1! DATA@ REL ;
: P!REL ( PadLast --         )                      FF CR1! DATA! REL ;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18033779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档