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

    +128

    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
    [Record] variant ItemPatternMatched: PatternMatchedBase, IPatternMatched
    			_matchByLexemeValue:option[string]
    			public Match(source:SourceLexemes, namedLinkDictionary:NamedLinkDictionary):MatchResult
    				match(source)
    					|[]               => MatchResult.EndOfLexemes(source, namedLinkDictionary)
    					|lexeme_::lexemes_=>    def updatedNamedLinkDictionary = updateNamedLinkDictionary(lexeme_::[], namedLinkDictionary);
    											def failure = MatchResult.Failure(source, namedLinkDictionary);
    											def success = MatchResult.Success(lexemes_, updatedNamedLinkDictionary);
    											match(_matchByLexemeValue)
    												|None | Some(lexemeValue_) when (lexemeValue_==lexeme_._value) =>											
    													match(this, lexeme_._type)
    														|(Symbol, SourceLexeme.Type.Symbol) | (Identificator, SourceLexeme.Type.Identificator) | (Number, SourceLexeme.Type.Number) => 
    															success
    														|_                                                                                                                          => 
    															failure
    												|_                                                             => 
    													failure
    			|Symbol
    			|Identificator
    			|Number

    Начальник, посмотрев на код, сказал, что NemerleGovno. Я не знаю, что ему ответить?

    Запостил: LispGovno, 30 Октября 2012

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

    • А я проникся немерловыми ADT.
      Фактически тут 3 конструктора:
      Symbol|Identificator|Number
      Каждый из них имеет один параметр _matchByLexemeValue:option[string], а ещё, хоть в данном случае их нет, но могут быть дополнительные параметры (также как в Scala или Haskell), свойственные конкретному из 3х конструкторов.
      Это выглядело бы как-то:
      _matchByLexemeValue:option[string]
      |Symbol
          c:char
      |Identificator
          s:string
      |Number
          n:int
      //Так получилось 3 конструктора, принимающих по 2 параметра:
      //option[string], char
      //option[string], string
      //option[string], int

      Подозреваю, что не в Scala, не в Haskell такой красотки нет?
      А ещё поддерживается наследование ADT от класса или от интерфейса, как мы видим в коде выше.
      Такого уж точно нигде нет.
      Ответить
      • > А ещё поддерживается наследование ADT от класса или от интерфейса, как мы видим в коде выше.
        > Такого уж точно нигде нет.
        Scala:
        sealed abstract class Lexeme(matchBy: Option[String]) { /* Your methods here */ }
        case class Symbol(matchBy: Option[String], c: Char) extends Lexeme(matchBy) with SomeTraitYouWant
        case class Identifier(matchBy: Option[String], s: String) extends Lexeme(matchBy)
        case class Number(matchBy: Option[String], n: Int) extends Lexeme(matchBy)
        Haskell
        data Lexeme = Symbol (Maybe String) Char
            | Identifier (Maybe String) String
            | Number (Maybe String) Int
        
        instance SomeTypeclass Lexeme where
            -- ...
        Ответить
        • Ладно, с наследованием согласен, но в том же коде Хаскела не эквивалентный код приведенному выше.
          Тк, _matchByLexemeValue содержится во всех конструкторах ItemPatternMatched, то к нему можно обратится без матчинга, например:
          def a = ItemPatternMatched.Symbol(None(), 'Y');
          А дальше мы обращаемся к a._matchByLexemeValue как к обычному полю структуры и матчить, чтобы вытащить _matchByLexemeValue не нужно. Матчить понадобится только когда c или s или n захочется вытащить. А в Хаскеле в данном случае в любом случае придется матчить, не говоря уж о копипасте (Maybe String) в каждый конструктор и отсутствия именованности полей.
          Ответить
          • > А в Хаскеле в данном случае в любом случае придется матчить
            Да. Можно, конечно функцию написать, или определить варианты через синтаксис записей (что лишит нас возможности паттерн-матчинга), но это не так удобно.
            С другой стороны, в Haskell есть typeclasses, что гораздо лучше интерфейсов
            Ответить
            • >С другой стороны, в Haskell есть typeclasses, что гораздо лучше интерфейсов
              Здесь соглашусь. Сильнейшая штука. Жаль в Скале typeclasses эмулируют и реализуют только как паттерн-проектирования и в отличии от Хаскеля оно не встроено в язык (приходится многословить).
              Ответить
            • >Да. Можно, конечно функцию написать
              Внутри все равно матчить придется. О(n) взамен O(1), но согласен, хоть многословно и не расширяемо, но решает.
              Ответить
              • > О(n) взамен O(1)
                Что-то мне подсказывает, что O(log n), где n - число конструкторов
                Ответить
                • Зависит от реализации компилятора. Оптимизатор может и Хештаблицу составить О(1) или определить, что здесь кроме одного конструктора ничего не используется О(1) и тд. А может и напортачить до О(n).
                  А вообще в Хаскеле порядок case of вроде важен.
                  И подумай над тем, что O(log n) требует Ordering. Хотя... это глупость.
                  Ответить
            • > что лишит нас возможности паттерн-матчинга
              Наглая ложь, минусуйте меня, минусуйте меня полностью! Для записей есть аж два синтаксиса паттерн-матчинга!
              http://ideone.com/Z8Plzd
              Ответить
    • Начальник, как всегда, прав.
      Ответить
      • А что тебе то не понравилось в Немерле?
        Ответить
        • По сравнению с этим - кресто-шаблонная магия и однострочники на perl кажутся псевдокодом.
          Ответить
          • Дык вроде обычный функциональный код, как и в любом другом языке. На Скалу Немерле похож, если не считать того, что в скале любят все делать через классы и в этом коде топика включен стиль индентация питона (единственное что его удаляет от скалы).

            Вообще если спросите, то пясню любую хрень.
            Ответить
            • В петоне, имхо, индентация не настолько адовая (не по 20 пробелов на шаг).
              Ответить
              • Наш друг просто выдрал из середины модуля, не сдвинув код влево, ГК отрезал начало строки. Плюс, использует табуляцию вместо пробелов (sic!), а один таб как 8 пробелов отображается.
                Ответить
    • >lexeme_::[]
      Кстати, поправил так: [lexeme_]
      Ответить
    • http://govnokod.ru/12262#comment163877
      сохраню и себе полный список статей и видео на тему nemerle


      http://liveworkspace.org/
      Гип гип Ура! Снова поднялся!
      Ответить
      • Посоны, лайвворкспейс вычислен по айпи:
        http://85.25.109.216/
        http://liveworkspace.org/code/description
        Ответить
        • новый http://liveworkspace.org/

          1)Поддержка ввода вывода на файловую систему пока до 1 мб.
          2)Много языков, в том числе последний хацкел, D, gcc и clang
          http://liveworkspace.org/code/requests
          - здесь можно оставить просьбу на добавление языков и библиотек, типа буста в язык.
          3)ввод\вывод на сокеты
          4)параметры командной строки компилятора и программы и ввода пользователя
          5)снипеты
          6)личный кабинет
          7)в перспективе поддержка файлов-проектов
          8)инклудинг других исходных кодов в разрабатываемый код
          9)форум

          >p.s.
          >IE не состоит в списке поддерживаемых браузеров. не сообщайте о IE-specific багах.
          Ответить
          • > ввод\вывод на сокеты
            Не боится, что станет платформой для рассылки спама или запуска эксплойтов?
            Ответить
            • Вот я тоже про это подумал. Ну или кто-то начнет его использовать для "распределенных вычислений". Отправил данные, а он посчитал.

              И это... Нужно сотню акков зарегать, и потом продавать за большие деньги, тк порты скоро закончатся. Там говорит каждому свой выдается.
              Ответить

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