1. Swift / Говнокод #18746

    −30

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    struct Family: Enumerable {
      var name = "Smith"
      var father = "Bob"
      var mother = "Alice"
      var child = "Carol"
    
      func each(block: (String) -> Void) {
        for i in 0...2 {
          switch i {
            case 0: block("\(father) \(name)")
            case 1: block("\(mother) \(name)")
            case 2: block("\(child) \(name)")
            default: break
          }
        }
      }

    }

    http://matthijshollemans.com/2015/07/22/mixins-and-traits-in-swift-2/

    Pattern matching головного мозга. Верно говорят, что тот, кто не умеет делать, идет учить других как надо делать.

    Запостил: gumbert, 21 Сентября 2015

    Комментарии (11) RSS

    • Как называется этот говнопаттерн?
      Ответить
      • Свитч (цепочка ифов) в цикле довольно частый гость на ГК. Но устоявшегося названия почему-то нет. Что-то из области спагетти (запутанный порядок выполнения) или золотого молотка (любовь к циклам) или раздувания...
        Ответить
      • Цикл Дейкстры. Запись в псевдокоде:
        do
            (i == 0) → {block("\(father) \(name)"); i++;},
            (i == 1) → {block("\(mother) \(name)"); i++;},
            (i == 2) → {block("\(child) \(name)"); i++;}
        od

        Насколько мне известно, отдельный синтаксис для цикла Дейкстры есть только в языке программирования Оберон-07:
        WHILE i = 0 DO block("\(father) \(name)"); INC(I)
        ELSIF i = 1 DO block("\(mother) \(name)"); INC(I)
        ELSIF i = 2 DO block("\(child) \(name)"); INC(I)
        END
        Ответить
        • Теперь всё то же самое, но на "PHP".
          Ответить
          • Оригинал (без внешнего цикла):
            foreach(range(0, 2) as $i) {
                  switch($i) {
                    case 0: block("(father) (name)"); break;
                    case 1: block("(mother) (name)"); break;
                    case 2: block("(child) (name)"); break;
                    default: break;
                  }
                }
            https://ideone.com/InOiRB

            Цикл Дейкстры:
            $i = 0;
            do {
                    if ($i == 0) {block("(father) (name)"); $i++;}
                    else if ($i == 1) {block("(mother) (name)"); $i++;}
                    else if ($i == 2) {block("(child) (name)"); $i++;}
                    else break;
                } while(true);
            https://ideone.com/JKUvDt

            Ну и на всякий случай устройство Даффа:
            $i=0;
            do {
                switch($i) {
            	    case 0: block("(father) (name)"); $i++;
                    case 1: block("(mother) (name)"); $i++;
                    case 2: block("(child) (name)"); $i++;
                    default: break;
                }
            } while (true);
            https://ideone.com/ja6ksz
            Ответить
        • То ли дело Си:
          #include <stdio.h>
          #define DO for(;;) { if (0){
          #define ON(condition) continue;} if(condition) {
          #define OD continue;}break;}
          
          int main(void) {
              int i = 0;
              DO
                  ON(i % 3 == 2)
                      printf("%d\n", i);
                      ++i;
                  ON(i < 9)
                      printf("%d ", i);
                      ++i;
              OD
          }
          Ответить
          • Цикл-паук:
            #include <stdio.h>
            #define PRIM_CAT_(a, ...) a ## __VA_ARGS__
            #define PRIM_CAT(...) PRIM_CAT_(__VA_ARGS__)
            
            #define DO for(;;) {
            #define ON(condition, ...) if(condition) {__VA_ARGS__; continue;}
            #define OUT(condition, ...) if(condition) {__VA_ARGS__; break;}
            #define ELSE
            #define OD break;}
            
            int main(void) {
                int i = 1;
                DO
                    ON(i % 4 == 0,
                        printf("%02dn", i);
                        ++i;)
                    ON(i < 15,
                        printf("%02d, ", i);
                        ++i;)
                    OUT(i == 15,
                        printf("%02d.n", i);)
                    ELSE
                        printf("Непредвиденная ситуацияn");
                OD
            }
            https://ideone.com/UTCOAe
            Ответить
            • Оказывается, в Питоне у циклов есть секция else, почти как тут.

              Сразу трудно понять, зачем она нужна, ведь у Питона нет секции out и вроде бы else должна выполниться всегда. Однако, если в теле цикла будет вызов break по условию, то секция else не выполнится. Получится цикл-паук: секция out эмулируется комбинациями if-break.
              Ответить
          • Офтопик. Изучая виды циклов, наткнулся на интересные конструкции.

            1. exitwhen: https://en.wikipedia.org/wiki/Control_flow#Multiple_early_exit/exit_from_nested_loops
            exitwhen found or missing;
                   for I := 1 to N do
                       for J := 1 to M do
                           if table[I,J] = target then found;
                   missing;
            exits
                   found:   print ("item is in table");
                   missing: print ("item is not in table");
            endexit;


            2. COMEFROM: https://en.wikipedia.org/wiki/COMEFROM
            Это как GOTO, только ставится не в месте вызова, а в месте назначения.
            Ответить
            • Первому посвящена отдельная статья:
              https://en.wikipedia.org/wiki/Zahn%27s_construct
              Ответить
        • То ли дело Free Pascal:
          {$macro on}
          {$define start := while true do begin if false then begin}
          {$define on :=  continue end else if}
          {$define do_ := then begin}
          {$define done := continue end; break end}
          
          var i: integer;
          
          begin
              i := 0;
              start
                  on i mod 3 = 2 do_
                      writeln(i);
                      inc(i);
                  on i < 9 do_
                      write(i, ' ');
                      inc(i);
              done
          end.


          https://ideone.com/1xezYk
          Ответить

    Добавить комментарий