1. Python / Говнокод #23288

    +2

    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
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    #!/usr/bin/env python
    
    import jinja2
    
    import contextlib
    import os.path
    import shutil
    import subprocess
    import sys
    import tempfile
    
    
    @contextlib.contextmanager
    def rm_dir(d):
        yield d
        shutil.rmtree(d)
    
    
    def main():
        if len(sys.argv) < 2:
            return
    
        if os.path.basename(sys.argv[1]) != "compile":
            subprocess.call(sys.argv[1:])
            return
    
        command = sys.argv[1:]
        preprocessed_files = []
    
        with rm_dir(tempfile.mkdtemp()) as tmpdir:
            print "Temp dir is", tmpdir
    
            while len(command) > 0 and not command[-1].startswith("-") and command[-1].endswith(".go"):
                tmpfile = os.path.join(tmpdir, str(len(command)) + ".go")
    
                with open(command[-1]) as input:
                    with open(tmpfile, "wb") as preprocessed:
                        print "Preprocess", command[-1], "into", tmpfile
                        preprocessed.write(jinja2.Template(input.read()).render())
    
                preprocessed_files.append(tmpfile)
                command.pop()
    
            subprocess.call(command + preprocessed_files)
    
    
    if __name__ == "__main__":
        main()

    Прикручиваем шаблонизатор jinja к го, чтобы копипастить с комфортом. Использовать так:

    go build -toolexec '/path/to/preprocess.py' package_na_go

    Запостил: 123123123, 22 Августа 2017

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

    • SEO: #я #починил #go
      Ответить
    • Говно
      Ответить
      • И правда. Файлы-то в обратном порядке передаются в компилятор. Но наверное в данном случае это не важно.
        Ответить
    • Теперь на этом можно программировать хотя бы.
      {% macro govnize(T) -%}
      {{T[0] | upper + T[1:]}}
      {%- endmacro %}
      
      
      {% macro Stack(T) -%}
      Stack{{govnize(T)}}
      {%- endmacro %}
      
      
      {% macro DefineStack(T) -%}
      type {{Stack(T)}} struct {
          massiv []{{T}}
      }
      
      func (stack *{{Stack(T)}}) Push(v {{T}}) {
          stack.massiv = append(stack.massiv, v)
      }
      
      func (stack *{{Stack(T)}}) Top() {{T}} {
          return stack.massiv[len(stack.massiv) - 1]
      }
      
      func (stack *{{Stack(T)}}) Pop() {{T}} {
          result := stack.Top()
          stack.massiv = stack.massiv[:len(stack.massiv) - 1]
          return result
      }
      {%- endmacro %}
      
      {{DefineStack("uint64")}}
      
      func main() {
          var stack {{Stack("uint64")}}
      
          fmt.Printf("%v", stack)
      
          stack.Push(1)
          stack.Push(2)
          stack.Push(3)
      
          fmt.Printf("%v", stack)
      
          fmt.Printf("%v", stack.Pop())
          fmt.Printf("%v", stack)
      
          return
      }
      Ответить

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