← All posts tagged programming

После полутора часов внимательного find&replace в виме на ручном приводе, вздохнул и написал в 200 строк на питоне интерактивный функциональный ленивый sed с упрощенными регулярками и подсветкой синтаксиса, работающий сразу с пачкой файлов.

Потыкал палочкой Elm. Штука красивая (не javascript, однако). Почти как хаскель — раз уж скомпилилось, наверняка работает правильно. Но вот как на нем дергать какие-нибудь http-ручки — это просто тушите свет.

...через 4 дня отладки N обнаружил, что из всех криптобиблиотек openssl единственная инициализирует параметр XXX не нулем, а случайным значением. Еще через 5 дней отладки выяснилось, что это не случайное значение, а неинициализированная переменная...

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

Дано: библиотека, умеющая читать некоторый структурированный формат. Парсит входной поток и отдает его в виде последовательности логических "событий". Интерфейс на C, интересно обернуть его для хаскеля. В связи с этим есть вопросы.

В целом оригинальный интерфейс выглядит как-то так:
stream = xxx_stream_from_fd(0);
// stream' = xxx_stream_from_string(data, length);
reader = xxx_reader_new(stream);
while ((event_type = xxx_reader_get_next_event(reader)) != XXX_EVENT_END_STREAM) {
    switch (event_type) { ... value = xxx_reader_get_???(reader); }
}
xxx_reader_delete(reader);
xxx_stream_delete(reader);

Понятно, что в х-е это должно быть какой-то монадой. 
1. Обязательно ли для случая с from_string чтобы всё происходило в IO? Этого хотелось бы избежать. Как в таком случае должен выглядеть тип, общий для обоих вариантов входных потоков?
2. xxx_reader_get_string возвращает указатель на кусок буфера внутри парсера (для zero copy). Указатель инвалидируется следующим вызовом get_next_event. Возможно ли безопасно описать такой контракт в типах?

Придумал для себя упражнение на языки — к моей библиотеке работы с JSON-like форматом *** сделать биндинги для CPython, PyPy, Julia, Rust, Haskell. Может, еще и интереса ради Go добавлю.