1. Куча / Говнокод #5627

    +124

    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
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    ;;;; -*- Mode: lisp; indent-tabs-mode: nil -*-
    
    ;;; Copyright (C) 2011, Dmitry Ignatiev <[email protected]>
    
    ;;; Permission is hereby granted, free of charge, to any person
    ;;; obtaining a copy of this software and associated documentation
    ;;; files (the "Software"), to deal in the Software without
    ;;; restriction, including without limitation the rights to use, copy,
    ;;; modify, merge, publish, distribute, sublicense, and/or sell copies
    ;;; of the Software, and to permit persons to whom the Software is
    ;;; furnished to do so, subject to the following conditions:
    
    ;;; The above copyright notice and this permission notice shall be
    ;;; included in all copies or substantial portions of the Software.
    
    ;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    ;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    ;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    ;;; NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
    ;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    ;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    ;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
    ;;; DEALINGS IN THE SOFTWARE
    
    (in-package #:neural-flow)
    
    ;; Stolen from `trivial-garbage'
    
    #+openmcl
    (defvar *weak-pointers* (cl:make-hash-table :test 'eq :weak :value))
    
    #+(or allegro openmcl lispworks)
    (defstruct (weak-pointer (:constructor %make-weak-pointer))
      #-openmcl pointer)
    
    (declaim (inline make-weak-pointer))
    (defun make-weak-pointer (object)
      #+sbcl (sb-ext:make-weak-pointer object)
      #+(or cmu scl) (ext:make-weak-pointer object)
      #+clisp (ext:make-weak-pointer object)
      #+ecl (ext:make-weak-pointer object)
      #+allegro
      (let ((wv (excl:weak-vector 1)))
        (setf (svref wv 0) object)
        (%make-weak-pointer :pointer wv))
      #+openmcl
      (let ((wp (%make-weak-pointer)))
        (setf (gethash wp *weak-pointers*) object)
        wp)
      #+corman (ccl:make-weak-pointer object)
      #+lispworks
      (let ((array (make-array 1)))
        (hcl:set-array-weak array t)
        (setf (svref array 0) object)
        (%make-weak-pointer :pointer array)))
    
    (declaim (inline weak-pointer-value))
    (defun weak-pointer-value (weak-pointer)
      "If WEAK-POINTER is valid, returns its value. Otherwise, returns NIL."
      #+sbcl (values (sb-ext:weak-pointer-value weak-pointer))
      #+(or cmu scl) (values (ext:weak-pointer-value weak-pointer))
      #+clisp (values (ext:weak-pointer-value weak-pointer))
      #+ecl (values (ext:weak-pointer-value weak-pointer))
      #+allegro (svref (weak-pointer-pointer weak-pointer) 0)
      #+openmcl (values (gethash weak-pointer *weak-pointers*))
      #+corman (ccl:weak-pointer-obj weak-pointer)
      #+lispworks (svref (weak-pointer-pointer weak-pointer) 0))
    
    ;;Red-black tree
    
    (declaim (inline %node %nleft %nright %nparent %nred %ndata %ncode
                     (setf %nleft) (setf %nright) (setf %nparent)
                     (setf %nred) (setf %ndata) (setf %ncode)))
    (defstruct (%node (:constructor %node (data code parent red))
                      (:conc-name %n))
      (left nil :type (or null %node))
      (right nil :type (or null %node))
      (parent nil :type (or null %node))
      (red nil)
      data
      (code 0 :type (integer 0 #.most-positive-fixnum)))
    
    (declaim (inline %tree %tree-root (setf %tree-root)))
    (defstruct (%tree (:constructor %tree ())
                      (:copier %copy-tree))
      (root nil :type (or null %node)))
    
    (declaim (inline rotate-left))
    (defun %rotate-left (tree node)
      (declare (type %tree tree) (type %node node)
               (optimize (speed 3) (safety 0)))
      (let ((right (%nright node)))
        (when (setf (%nright node) (%nleft right))
          (setf (%nparent (%nleft right)) node))
        (if (setf (%nparent right) (%nparent node))
          (if (eq node (%nleft (%nparent node)))
            (setf (%nleft (%nparent node)) right)
            (setf (%nright (%nparent node)) right))
          (setf (%tree-root tree) right))

    Вылезли глаза! Как на этом можно писать?

    Запостил: vertexua, 10 Февраля 2011

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

    • писать можно, читать нельзя
      Ответить
      • Это сильно заоптимизированный код на CL. Естественно, можно проще и понятнее написать, не так сжато и так далее - но именно в этом случае это необходимо для оптимизации(и кстати, работает оно на уровне среднестатистической реализации RB-дерева на Си, так что не зря).

        А вот ебанату, сюда это кинувшему, похоже вообще программировать нельзя.

        За подробностями сюда, вот: http://www.linux.org.ru/forum/development/5882910/page1#comment-5891470
        Ответить
        • ))) он пришел обправдываться на говнокод. Поясню: этого чувака травят частенько на ЛОРе, потому что он постоянно пишет что-то в подобном стиле и ДОКАЗЫВАЕТ что это просто, читабельно и удобно. А если кто не согласен, то он переходит на мат и более не может себя контроллировать
          Ответить
          • вот смотрю, сколько там раз weak. Don't repeat yourself - сто пудофф )))
            Ответить
            • привет придурки
              Ответить
              • Скоро весь ЛОР будет в этом треде
                Ответить
                • И увидят, какой ты дебил. Хотя, думаю, и там твоих кривляний достаточно.
                  Ответить
                • даешь многопоточность матюков с лора на гк!
                  Ответить
          • показать все, что скрытоДавай назад на ЛОР, долбоебина, кушай там бананы.

            Скобочек, главное, заискивающих побольше, да.
            Ответить
            • анально ущемленный автор говнокода - priceless.
              Ответить
              • В каком месте он говнокод?

                Вот тут можно весь код посмотреть, кстати:
                https://github.com/Lovesan/neural-flow

                Я еще раз повторяю - то, как он выглядит, это совершенно не просто так, а ради скорости. Я выше еще ссылку дал, я там подробно рассказываю, зачем и почему оно так.
                Ответить
                • > В каком месте он говнокод?
                  там, где скобкота же
                  Ответить
                  • И что? Скобки, и? А в java фигурные скобки? На Java тоже один говнокод пишется, по определению? А единственно не-говноязык это Python?

                    Спасибо, но я такие вещества не употребляю.
                    Ответить
                  • Я еще даже прямее скажу - где можно посмотреть на реализацию RB-деревьев на каком-либо высокоуровневом языке(т.е. не на Си), которая бы обладала приличной производительностью и при этом выглядела "красивее" этого?
                    Ответить
                    • Я ещё прямее скажу - где можно посмотреть на реализацию RB-деревьев, которая бы хоть сколько-нибудь прилично выглядела?
                      Ответить
                      • В этом и дело.

                        Меня это просто выбешивает - я три дня из профайлера не вылезал, чтобы хоть сколько-нибудь приемлимую производительность той библиотеке придать, опустился до ручного закатывания солнца и на низком уровне оптимизированных rb-деревьев, и тут этот вот дебил, который запостил сюда мой код - кривляется как макака и несет какую-то pointless хуйню, совершенно никакими рациональными аргументами не обоснованную, типа "лисп-гавно, гыгы".
                        Ответить
                        • просто совершенно непонятно -- нахуй Вы это делали
                          в даже есть реализация RB деревьев в TreeMap/HashMap, и вполне приличный код например
                          Ответить
                          • где?
                            Ответить
                            • http://download.oracle.com/javase/6/docs/api/java/util/TreeMap.html
                              Ответить
                              • я не спорю с тем, что реализации словарей через rb-деревья существуют, я говорю - а код где? И, главное, чем он лучше и красивее моего:
                                https://github.com/Lovesan/neural-flow/blob/master/src/tree.lisp
                                Ответить
                                • Что, кто-то сказал "словарь"? То есть ключом является строка, т.е. массив символов? Нахуй РБ-деревья, от который у меня ещё на 2 курсе крыша ехала! Только префиксные деревья, которые намного проще в написании!
                                  Ответить
                                  • >> от который у меня ещё на 2 курсе крыша ехала!
                                    фейспалм))))
                                    Ответить
                                  • Чем Вам деревья не угодили? Каждое имеет свои плюсы.
                                    Ответить
                                    • Для ключа-строки префиксное лучше, чем РБ.
                                      Ответить
                                • скачай джава сдк да посмотри сырцы
                                  Ответить
                  • жаль что нельзя плюсануть много раз
                    Ответить
              • Всегда спасибо. Он уже мне целый вечер доставляет. Удалить из его слов баттхерт, так вообще мало текста будет. И в основном одно и то же.
                Ответить
              • для остального есть мастер кард
                Ответить
            • >>Скобочек, главное, заискивающих побольше, да.
              батхард детектед
              ололо
              Ответить
        • чем лиспы компилишь/исполняешь если не секрет?

          есть еще в мире лисп который емаксом не проет насквозь?
          Ответить
          • SBCL использую, в основном
            www.sbcl.org

            Для винды лучше брать версию отсюда:
            http://www.siftsoft.com/inprogress/forknews.html
            она пропатченная там специальным образом, stdcall-коллбэки добавлены, foreign-thread коллбэки, многопоточность нормально реализована, и прочее, ну там расписано.
            Ответить
            • apt-get install sbcl тоже прокатило ;)

              туториал наковырял, поковыряю на досуге.
              Ответить
    • Всё-таки, лисп - это эзотерика, на промышленный ЯП он не тянет.
      Ответить
      • На самом деле, не сильно то эзотерика.
        На вполне себе пишут коммерческие приложения.
        Вот, например:
        http://www.itasoftware.com/products/shopping-pricing/qpx.html
        Или вот, человек пишет софт для бирж:
        http://13-49-ru.blogspot.com/search/label/lisp

        Проблема есть, если говорить о промышленном применении. Но она в том, что инфраструктуры мало(библиотек, и так далее), и программеров на нем, соответственно.

        Вообще, если заинтересует, у меня в жж можно посмотреть по тегу "lisp":
        http://love5an.livejournal.com/tag/lisp
        Он не такой уж страшный и особенно отличный от мейнстримных языков.
        Ответить
        • Грустно что и не выростет community никогда...
          Ответить
        • > Или вот, человек пишет софт для бирж:

          Ключевое слово "человек". Понять свой метакод ещё можно (сам написал потому что). Понять метакод, написанный другим человеком, невозможно.
          Ответить
          • Ну там целая компания, стартап, не один же человек.

            DSL-и надо создавать для специфических целей, естественно, и согласовывать их использование, но тем не менее, тут ситуация не очень сильно отличается от "обычных языков", с использованием, к примеру, ANTLR.
            Ответить
            • Никто не спорит что на нем можно писать. Но можно и на других языках. Что поголовно все нормальные компании и делают, ибо удобнее, быстрее и надежнее
              Ответить
              • показать все, что скрытоЯ тебя еще там спрашивал - что ты вообще понимаешь в SE и SA, на каких вообще языках ты писал, и какой код? Ты так и не показал, и начал кривлять жопой, как макака. И теперь еще тут хуйню несешь, совершенно тупую и ничем не обоснованную. Тебе еще банан там скинуть?
                Ответить
                • Немедленно прекратите обезьянничать!
                  (давайте лучше про коммерческое использование лиспа ещё)
                  Ответить
      • Пользователи автокада смотрят на тебя как на идиота.
        Ответить
    • Плюсую только из-за того, что это лисп, тк его здесь совсем нет.
      Ответить
      • Та я могу свои говнокоды на елиспе выкладывать. Только все равно никто не врубится, в чем говнокод. Да и унылы они.
        Ответить
    • Имхо, код на Лиспе вполне легко читается, если делать это в редакторе с подсветкой синтаксиса.
      Я щетаю, что юзать Лисп и Схему вполне можно. Однако, сейчас есть современные более мощные функциональные (а точнее, мультипарадигменные) языки с метапрограммированием. Маленькая подсказочка - это Nemerle ;)
      Ответить
      • оой, да ну эту вашу заливную рыбу, немерлю.

        Она же совершенно к продакшн не готова - чисто исследовательский проект. Для CL того же как минимум 3 коммерческих вендора компиляторы поставляют. Плюс, все же там макросы не настолько удобно использовать, как в лиспах(типизированное AST это излишнее усложнение, на самом деле - Nemerle не первая попытка, которая провалилась). ОО-система, опять же, до CLOS не дотягивает, сигнального протокола нет.
        Лучше уж Clojure.
        Ответить
    • Сегодня у нас пополнение? Много новеньких с лора?
      Ответить
    • А что?
      Язык как язык. Скобочки, отступы, хеловорлды, все дела.

      А то что поругаться сюда пришли - это вы конечно молодцы.
      Ответить
    • У автора в жжшечке написано "Школа веб-мастерства им. С. Соколова - Геленджик"
      геленджик -- это же родина гипертекстового интернета!!!!
      Ответить
    • толсто, слишком толсто. Мой кишечник не принимает большую часть комментов )
      Ответить
    • Какая-то глупость, в смысле не код, а обсуждение... В коде вообще ничего такого нет... может смутить то, что много аргументов в функции, да и то относительно много... тем более, что если это для оптимизации. А не читабельно - ну, представьте китайца пробующего разобраться в программе на 1С...
      Ответить
      • как раз "много аргументов у функции" часто случается в функциональном программировании)))))))
        Ответить
    • А чо? Написано neural flow. Это что-то про моск, стопудов. Нам не понять…
      Ответить

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