Ябло (Свежее) / Говнокод #18746 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 gumbert, (Updated )

Комментарии (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
      Ответить
        • Оригинал (без внешнего цикла):
          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, только ставится не в месте вызова, а в месте назначения.
          Ответить
      • То ли дело 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
        Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8