我正试图通过做欧拉项目练习来教自己。我已经研究过几个教程,但是我没有找到任何关于如何定位关键字/控制结构的明确指南。Emacs forth-mode似乎对如何对代码进行格式化有所了解,但我并不完全相信我所看到的内容:),例如,下面的代码:
: euler1
0 1000 0
do i dup 3 mod -rot 5 mod -rot -rot * 0=
if i + then
loop ;用这种方式格式化它有意义吗?你把条件放哪儿了?如果有任何样式指南/示例集合,您认为它们的格式是正确的,那么请您给我参考一下这个示例好吗?
发布于 2013-08-04 17:27:04
如果您的意思是按照空格的位置设置格式,那么您的示例看起来相当合理;循环和单词的缩进使代码对于更习惯于需要缩进或括号的语言的人来说相当容易读。
我的风格偏好会更像下面的代码,但我不知道你的代码是做什么的,所以我可能已经安排它的方式没有完美的意义。通常,我会将条件的条件与关键字一起放在新行上,如果条件很复杂,我会将其输入到自己的单词中(下面是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使用:进入缩进区域的方式(或者visual如何使用Then (见第二个示例))。
if true:
print("True")thens和loops相当于关闭花括号或关键字,如Visual中的End If。
If True Then
MsgBox "True"
End If(这是一个稍微令人费解的例子,因为当时的使用与Forth中的使用有所不同)
发布于 2013-08-06 13:01:33
作为初学者,请帮自己一个忙,并对您的代码进行彻底的评论,比如:
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 ;你会发现:
我会这样写:
: 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
;发布于 2015-02-25 01:23:22
今天写的第四篇文章中有很多都是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 = ;现在很容易看到( easy )是一个因素,可以分解为另一个词,如果需要。
另一个风格点是,查找/解析单词应该向左平放,而常规后缀词应该向右平放,如下所示:
: P@REL ( -- PadLast ) FF CR1! DATA@ REL ;
: P!REL ( PadLast -- ) FF CR1! DATA! REL ;https://stackoverflow.com/questions/18033779
复制相似问题