我正在尝试通过项目欧拉练习来教自己。我已经查看了几个教程,但是我找不到关于如何定位关键字/控制结构的任何明确指南。 Emacs forth-mode
似乎对如何格式化代码有所了解,但我并不是真的相信我所看到的:)所以,例如,下面的代码:
: euler1
0 1000 0
do i dup 3 mod -rot 5 mod -rot -rot * 0=
if i + then
loop ;
以这种方式格式化是否有意义?你把条件放在哪里?如果有任何样式指南/示例集合,您认为这些示例格式正确,请您参考该示例吗?
答案 0 :(得分: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 ;
你会看到:
我会这样写:
: 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
;
答案 1 :(得分:1)
如果你的意思是在空格应该去的地方进行格式化,你的例子似乎很合理;缩进for循环和单词使得代码对于更习惯于需要缩进或括号的语言的人来说是相当可读的。
我的风格偏好更像下面的代码,但我不确定你的代码是做什么的,所以我可能以一种没有完全意义的方式安排它。一般情况下,我会将条件设置为条件新条件以及关键字,如果条件复杂,我会将其分解为自己的单词(下面为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使用{{1}的方式的视觉提示。输入缩进区域(或Visual Basic如何使用:
(参见第二个示例)),例如
Then
if true:
print("True")
和then
与在Visual Basic中关闭大括号或loop
等关键字等效。
End If
(这是一个有点混乱的例子,因为使用Then与它在Forth中的使用不同)
答案 2 :(得分: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 ;