• Jsqry — библиотека для запросов к JS объектам и массивам

      Представляю вашему вниманию небольшую js-библиотеку Jsqry.
      Проще всего проиллюстрировать её назначение следующим примером.


      До:


      var name;
      for (var i = 0; i < users.length; i++) {
          if (users[i].id == 123) {
              name = users[i].name;
              break;
          }
      }

      После:


      var name = one(users, '[_.id==?].name', 123);

      Библиотечка позволяет извлекать информацию из объектов/массивов в одну строку, используя несложный язык запросов, вместо написания циклов (подчас вложенных).

      Читать дальше →
    • XPath: ускоряем итерацию по NodeList

        При попытке обработки не очень маленького регулярного XML-файла (на самом деле всего лишь около тысячи записей) обнаружил, что итерирование по NodeList вместе с извлечением с помощью XPath начинает существенно тормозить (занимая порядка 2 минут на моём файле), причем тормоза увеличиваются с обработкой каждого следующего узла (node). Эта проблема поднимается также

        blog.astradele.com/2006/02/24/slow-xpath-evaluation-for-large-xml-documents-in-java-15

        jbwhammie.blogspot.com/2011/02/make-java-xpath-work-on-large-files.html

        Читать дальше →
      • Задача Эйнштейна на Mercury

          Продолжаем неделю задачи Эйнштейна на Хабре. В дополнение к трём представленным решениям
          1. Регулярным языком
          2. Хаскеллем
          3. Прологом

          позвольте представить еще одно на Mercury.

          Напомним Википедию:

          Mercury — язык функционально-логического программирования со строгой типизацией…
          Читать дальше →
        • Пишем интерпретатор Brainfuck на Mercury

            Продолжая неделю Brainfuck на хабре и свои эксперименты с Mercury, написал свою версию интерпретатора. Заранее прошу извинить, что еще не представил «вступительную» статью о Mercury. На самом деле, она в процессе написания.
            Пока же приведу код решения, который проиллюстрирует заодно несколько возможностей языка Mercury.
            Читать дальше →
          • Игра Жизнь на языке программирования Mercury

              В рамках экспериментов с языком программирования Mercury а также под впечатлением уже неоднократно поднимавшейся в последнее время здесь темы игры Жизнь (1, 2, 3) захотелось написать свою реализацию на этом интересном языке программирования.

              В двух словах о Mercury. Этот язык функционально-логического программирования замышлялся как усовершенствование prolog'а. Усовершенствование заключается в введении в пролог статической типизации (а так же декларирование режима детерминизма). Как результат — больше возможностей у компилятора создать эффективный исполнимый код, больший контроль на этапе компиляции. Любителям пролога, наверняка знаком анекдот:
              Q: How many Prolog programmers does it take to change a light bulb?
              A: False.

              В царстве прологов нишу типизированных прочно занимает Visual Prolog. Но, стоит отметить, что подходы Visual Prolog и Mercury весьма отличны.
              Читать дальше →
            • Реализация переборного механизма пролога на Python

                Как известно (некоторым), пролог обладает тем замечательным свойством, что вызов каждого предиката в общем случае порождает несколько (хотя, может и не одной) точек возврата. Это значит то, что если на некоем шаге вызов очередного предиката потерпит неудачу, будет произведен откат исполнения к ближайшей точке возврата, и продолжено исполнение с новыми альтернативными данными, возращаемыми предикатом, породившим возврат. Когда все возвраты в некой точке исчерпаются, будет производится откат к предыдущим, пред-предыдущим и т.д. точкам возврата. Вероятно, смекалистый читатель уже сообразил, что то что в прологе записывается линейным набором предикатов, типа

                pred1(X, Y), pred2(Y, Z), pred3(Z).


                в традиционных языках представляется чем-то вроде следующей вложенной конструкции

                for Y in pred1(X) {
                  for Z in pred2(Y) {
                    pred3(Z)
                  }
                }


                В принципе, именно на этом замечательном свойстве основано удобство, лаконичность и декларативность решений некоторых классов задач на прологе (разбор текста, задачи поиска, ...). Вероятно, после прочтения предыдущей части этого сообщения вам станет в общих чертах понятно приводимое мною ранее решение одной занимательной задачки.

                Однако, мы отвлеклись.
                Читать дальше →
              • Цепной квайн произвольного порядка на Python

                     Впечатленный цепным полиглотным квайном японца, приведенным в этом хабратопике, я, ранее уже встречавшийся с программами-квайнами, решил познакомиться с ними плотнее. После беглого гугления и непродолжительного чтения вики/блогов/сайтов по теме, у меня зачесались руки и захотелось написать свой квайн. Квайн был написан, даже в нескольких вариантах, но этого мне показалось мало. Позже я даже написал двойной квайн (код на python генерирует код на prolog а код на prolog в свою очередь первоначальный python-код).

                     Однако, тут возник вопрос. А можно ли написать квайн любого порядка (т.е. тот, который будет переходить сам в себя после N запусков)? Как оказалось, это вполне возможно. Результатом изысканий явился следующий код:

                  # xonix
                  L=19;B,Q,N,q,n=map(chr,(36,81,78,39,10))
                  X='import sys;sys.stdout.write(%s%s%s.replace(chr(36)+chr(81)+chr(36),chr(39)).replace(chr(36)+chr(81),chr(36)).replace(chr(36)+chr(78)+chr(36),chr(10)).replace(chr(36)+chr(78),chr(36)))'
                  Y='# xonix%sL=%s;B,Q,N,q,n=map(chr,(36,81,78,39,10))%sX=%s%s%s%sY=%s%s%s%sE="""%s""";exec E%simport sys;sys.stdout.write(b())'
                  E="""def b(l=L):
                    if l==L: Ql=q
                    else: Ql=B+Q*(L-l)+B;Nl=B+N*(L-l)+B
                    if l>0: return X%(Ql,b(l-1),Ql)
                    else: return Y%(Nl,str(L),Nl,Ql,X,Ql,Nl,Ql,Y,Ql,Nl,E.replace(n,Nl),Nl)"
                  "";exec E
                  import sys;sys.stdout.write(b())


                  Читать дальше →
                  • +25
                  • 1,1k
                  • 9
                • Небольшой лайфхак: смотрим скрытые записи на Хабре, используя Google

                    Обычно читаю посты Хабра через Google Reader. Бывает начнешь читать какую-нибудь, возможно, интересную запись, кликаешь «Читать дальше» и получаешь «Доступ к публикации закрыт» как вот здесь: habrahabr.ru/blogs/java/73080

                    Метод весьма прост, открываем google.ru и в строке поиска набираем

                    cache:http://habrahabr.ru/blogs/java/73080/

                    Ну и продолжаем чтение.

                    Разумеется, метод сработает не всегда, а только если автор не сразу закрыл топик, и гугл успел его закешировать.
                  • (Python) Парочка полезных декораторов

                      import should
                        
                      @should.give((5,2),7)
                      @should.give(("aa","bbb"),"aabbb")
                      @should.give(([1],[2,3]), [1,2,3])
                      @should.give((1,1),1) # test
                      def add(a,b):
                        return a+b
                        
                      @should.throw((1,0), Exception)
                      @should.throw((5,0), ZeroDivisionError)
                      @should.throw((5,0), TypeError) # test
                      @should.throw((5,1), TypeError) # test
                      def div(a,b):
                        return a/b



                      >pythonw -u "should.py"
                      [!] add(1, 1) should give 1, but got 2.
                      [!] div(5, 1) should raise TypeError, but raised nothing.
                      [!] div(5, 0) should raise TypeError, but raised ZeroDivisionError.
                      >Exit code: 0


                      Читать дальше →