alexey_rom: (Default)
Возник такой вопрос. Как устроены cons-списки, большей части читающих известно :) А мне сейчас пригодилось бы неизменяемое представление списков в неленивом функциональном языке с хвостовой рекурсией, которое хорошо поддерживает две операции:
1) Конкатенацию (и как частный случай добавление элементов в начало и конец списка). Желательно хотя бы амортизированное O(1), O(log N) тоже сойдёт.
2) Итерацию от начала к концу. Без переполнения стека, независимо от того, как строился список.

Вот из-за второго условия простые conc-списки меня не устраивают, нужно какое-то балансирование. И чем проще, тем лучше.

Благодаря наличию хвостовой рекурсии направо деревья могут расти спокойно, главное, чтобы не росли налево.

Известные мне варианты:
1) Vector в Clojure и Scala. Хорошо добавляет элементы в конец, плохо в начало.
2) 2-3 finger tree (например, Data.Sequence в Haskell). Сложная схема балансирования и, как результат, великоваты постоянные множители у асимптотик (хотя жить можно).

UPDATE: Simple Confluently Persistent Catenable Lists и Purely Functional, Real-Time Deques with Catenation.
alexey_rom: (Default)
David R. MacIver проводит большой опрос насчёт того, какой язык лучше для каких целей. Думаю, найдутся те, кому будет интересно поучаствовать.

UPDATE: В общем, людям не понравилось. Но тем не менее, ответов набралось достаточно много, и результаты уже можно посмотреть.

Pex

Mar. 6th, 2010 10:10 am
alexey_rom: (Default)
Они это сделали! Я и не надеялся уже, но Pex будет доступен в VS 2010 (и 2008) Pro, а не только в Team Suite.

Для тех, кто не встречался с Pex: это дальний родственник QuickCheck для .Net (в первую очередь для C#). Дальний потому, что аргументы, на которых проверяются свойства, генерируются не случайно, а с помощью анализа тестируемого кода и попытки подобрать значения так, чтобы пройти по всем возможным потокам управления, а потом сохраняются в виде обычных юнит-тестов.

Теперь ещё бы статическую проверку контрактов в VS Pro и будет совсем замечательно.
alexey_rom: (Default)
Дочитал JavaScript: The Good Parts. Книга неплохая и короткая (а повторений всё равно хватает :( ) Насчёт недостатков во многом могу согласиться с этой рецензией, но я всё-таки оценил на 4, а не 3.
alexey_rom: (Default)
Понял, что забыл написать об этом в ЖЖ.

Есть очень полезное расширение NextPlease для FireFox, которое пытается автоматически найти на страницах форумов/поиска/блогов/и т.д. ссылки на следующую, предыдущую, первую и последнюю страницы и позволяет быстрый доступ к ним по нажатию кнопки на тулбаре или по горячей клавише.

Проблема с ним была в том, что автор последнюю версию выпустил два года назад и она была совместима только с FireFox 3.0. Стандартный метод "изменить maxVersion в install.rdf" давал совместимость с FF 3.5, а вот с FF 3.6 не работал.

Впрочем, это оказалось довольно легко исправить. Так что я теперь я новый разработчик этого расширения и выпустил версию, поддерживающую 3.6.
alexey_rom: (Default)
У меня возникла ситуация, совершенно невозможная, по моему пониманию. Описал её на форуме Mozilla Add-ons, но спрошу ещё и тут.

Есть два скрипта. Один -- главный, а другой для диалога опций.

Первый создаёт глобальный объект с именем "nextplease". Судя по всему, работает правильно. Ошибок в консоли не пояляется, "alert(typeOf(nextplease))" в Execute JS выдаёт "object". Все кнопки и клавиши работают как надо и т.д.

Беда в том, что второй скрипт его в упор не видит. Сейчас там стоит:
// $Id: nextpleaseOptions.js,v 1.16 2007/07/21 00:15:11 howie Exp $

alert(typeof(nextplease));

if (nextplease === undefined) {alert("nextplease is undefined!");}
if (nextplease && nextplease.DEBUG) {alert("nextplease is defined");}

Насколько я понимаю, nextplease === undefined -- правильный способ проверки на undefined; по крайней мере, в книге Крокфорда сказано именно так.

Так вот, при открытии диалога я вижу alert с "undefined". А "nextplease is undefined!" не вижу; вместо него в консоли появляются ошибки:

Error: nextplease is not defined
Source file: chrome://nextplease/content/nextpleaseOptions.js
Line: 5

Error: nextplease is not defined
Source file: chrome://nextplease/content/nextpleaseOptions.xul
Line: 1

Наконец, если я выполняю typeof(nextplease) и nextplease === undefined в консоли, а не в Execute JS, то я получаю undefined и Error: nextplease is not defined соответственно.

Есть ли у кого-нибудь объяснение этим фактам и/или идеи, что с этим можно сделать?
alexey_rom: (Default)
Bart de Smet пишет о новой Reactive Framework, которая войдёт в .NET 4.0 (очень интересная и полезная библиотека, кстати; и многие идеи взяты опять-таки из ФП, а точнее из Functional Reactive Programming).

В своём последнем посте он упомянул комбинатор Using, служащий для выделения ресурса и его освобождения после завершения работы с последовательностью. ... )
alexey_rom: (Default)
Владимир Ярославский придумал новый вариант быстрой сортировки, делающий меньше перестановок и более быстрый на практике. Детали здесь.
alexey_rom: (Default)
Learn You a Haskell for Great Good! Курс по Haskell с картинками. Ещё не закончен, но то, что есть -- вполне неплохо.
Learn You Some Erlang for Great Good! Автору так понравился Learn you a Haskell, что он решил сделать то же самое, но для Erlang. Пока есть только начало.
alexey_rom: (Default)
Появился пакет, который позволяет вызывать Хаскель из .Net и наоборот: haskell.forkio.com/dotnet

Пример оттуда:

module FileDialog where

import NET

selectFile :: IO String
selectFile = do
  obj <- new "System.Windows.Forms.FolderBrowserDialog"
  (obj :: Object ()) # invoke_ "ShowDialog" ()
  obj # getField "SelectedPath" ()

Выглядит очень интересно.

alexey_rom: (Default)
Замечательный учебник по функциональному программированию на Perl можно найти здесь:
hop.perl.plover.com/book/

alexey_rom: (Default)
Все говорят: Project Euler, Project Euler. А мне Sphere Online Judge (SPOJ) нравится больше, потому что там
1) разнообразнее задания
2) нужно посылать не ответ, а решение.

Profile

alexey_rom: (Default)
alexey_rom

April 2012

S M T W T F S
1 234567
89 1011121314
15161718192021
22232425262728
2930     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 24th, 2017 12:51 pm
Powered by Dreamwidth Studios