2013-08-03 4 views
3

Я пытаюсь научить себя Форту, выполняя упражнения Эйлера. Я изучил несколько руководств, но я не мог найти окончательного руководства относительно того, как позиционировать ключевые слова/структуры управления. Emacs forth-mode, кажется, есть некоторое представление о том, как код должен быть отформатирован, но я не совсем уверен, о том, что я вижу :) Так, к примеру, код ниже:Руководство по форматированию форвардного кода

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

ли смысл отформатировать сюда? Где вы положили условия? Если есть какой-либо стиль руководства/коллекция примеров, которые, как вы считаете, правильно отформатированы, не могли бы вы обратиться со мной к этому примеру?

+1

Я могу понять желание собрать больше очков кармы, но серьезно. .. Считаете ли вы, что ссылки на PE и Emacs настолько нужны? Разве вы не чувствуете себя немного неудобно, когда вы меняете чей-то вопрос, не добавляя никакой полезной информации или ничего не исправляя? :/ –

ответ

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 использует : для ввода области с отступом (или как Visual Basic использует Then (см. Второй пример)), например

if true: 
    print("True") 

В then s и s loop являются эквивалентами закрывающей фигурной скобки или ключевые слова, как End If в Visual Basic, например,

If True Then 
    MsgBox "True" 
End If 

(который является немного запутанным пример, как использование Тогда отличается от его использования в Forth)

+0

Хм ... спасибо за ответ. Вот одна вещь, которую я видел в одном онлайн-гиде (хотя из используемой терминологии я предполагаю, что она появилась в течение некоторого времени в 80-х/начале 90-х - они используют DOS для экранов операционной системы и звонков »). Итак, в этом учебнике автор ставит точку с запятой всегда на отдельной строке, например. –

+0

Не желая слишком философски или покровительствовать, акцент в руководстве по стилю фразы распространяется на руководство. Насколько разумно современные намеки на стиль Форта идут, документация GForth, вероятно, довольно хороший ресурс. Я не видел много на пути предписывающих руководств в стиле Форта, я бы предположил, что некоторые считают, что пробелы легкомысленны. Основная поговорка, похоже, заключается в том, чтобы превратить код в логические слова. – sheepez

+0

Хорошо, спасибо за ссылку. Еще один крошечный вопрос :) Я вижу, что несколько раз есть место перед закрывающей скобкой в ​​«аргументах слова», а в других случаях нет. Есть ли причина для этой асимметрии? Кроме того, GForth, похоже, не делает этого. –

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 
; 
+0

Говоря о новичках ... Не могли бы вы правильно отформатировать этот код? Отступы это 4 пробела, а Stackoverflow будет содержать символы новой строки и Здесь вам нужно «Markdown». – towi

+0

Хорошо. Спасибо за информацию. – anon

1

много Четвертой написанной сегодня имеет C вдохновленное форматирование.

Классический, и, я думаю, самый ясный способ форматирования Форта - выровнять соответствующие или связанные вещи.

Когда соответствующие фигуры выровнены, код легче пройти и может выставить общий фактор, который можно вытащить в свое слово. Вот фрагмент из моей четвертой библиотеки.

\ 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 РКА) является фактором, который может быть разбитым в другое слово, если это необходимо.

Еще стиль, предпросмотр/разбор слово должно быть на одном уровне с левыми и регулярными постфиксных словами вровень направо, как так:

: [email protected] (  -- PadLast)      FF CR1! [email protected] REL ; 
: P!REL (PadLast --  )      FF CR1! DATA! REL ; 
Смежные вопросы