• 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

                   Впечатленный цепным полиглотным квайном японца, приведенным в этом хабратопике, я, ранее уже встречавшийся с программами-квайнами, решил познакомиться с ними плотнее. После беглого гугления и непродолжительного чтения вики/блогов/сайтов по теме, у меня зачесались руки и захотелось написать свой квайн. Квайн был написан, даже в нескольких вариантах, но этого мне показалось мало. Позже я даже написал двойной квайн (код на 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())


                Читать дальше →
              • Еще о парсинге на Prolog'е

                  Вот тут наткнулся на, в общем-то, простую задачку состоящую в парсинге текстового файла, содержащего 5 миллионов float'ов (и подсчете их суммы). Файл генерируется следующим C#-кодом:
                  static void Main(string[] args)
                  {
                    using (Stream stm = new FileStream(@"d:\numbers_large.txt", FileMode.Create))
                    {
                      TextWriter wr = new StreamWriter(stm);
                      System.Random r = new System.Random();
                      for (int i = 0; i < 5000000; i++)
                      {
                        double d=10000*r.NextDouble() * (r.NextDouble() > 0.7 ? -1.0 : 1.0);
                        wr.Write("{0} ", d);
                      }
                      wr.Flush();
                    }



                  Задача ставилась в контексте обсуждения производительности haskell'я в применении его к задачам парсинга. Я знал, что на прологе подобные задачи решаются красиво и непринужденно используя технику DCG (Definite clause grammar: 1, 2, 3, 4). Фактически, это описание грамматик на языке Пролог, и парсинг по ним, основанный на переборно-откатном принципе работы пролога.

                  Ну то есть обычно получается очень кратко и красиво (например, вот решение задачки о сбалансированности скобок этим методом: программа из 7 строк), но, я подозревал, что не всегда быстро. Собственно, это мне захотелось проверить.
                  Читать дальше →
                • Японская версия головоломки «Волк, коза и капуста» на прологе

                    Эта головоломка уже знакома Хабрахабру по этой публикации.

                    Суть головоломки в следующем (цитируя bor1s):
                    Нужно перевезти семью из шести человек и полицейского с бандитом на другой берег реки на плоту. Однако одновременно на плот помещаются только два человека (уточнение: один из которых должен быть взрослым), мама, оставшись без папы, избивает мальчиков, папа — девочек. А бандит (уточнение: в отсутствие полицейского) просто мочит всех.

                    Пройти головоломку online можно по ссылке: http://freeweb.siol.net/danej/riverIQGame.swf.

                    Пролог обычно хорошо справляется с решением таких задач, в чем я и решил убедиться…

                    Читать дальше →
                  • RE: Занимательная задачка

                      Копаясь в поиске сайта, наткнулся на занимательную задачку и не смог отказать себе в удовольствии потратить 10 минут времени для решения её на полюбившемся мне прологе.

                      <br>% ((((1?2)?3)?4)?5)?6<br>solve(Formula) :-<br>    Signs = [+, -, *, //],<br>    member(Op1, Signs),<br>    member(Op2, Signs),<br>    member(Op3, Signs),<br>    member(Op4, Signs),<br>    member(Op5, Signs),<br>    A =.. [Op1, 1, 2],<br>    B =.. [Op2, A, 3],<br>    C =.. [Op3, B, 4],<br>    D =.. [Op4, C, 5],<br>    Formula =.. [Op5, D, 6],<br>    35 =:= Formula.<br>


                      Результат работы кода:
                      Читать дальше →