madf: (Default)
Випадково помітив:
POSIX Shell   C++98/03   C++11   Haskell

#!/bin/sh

for i in {1..4}
do
    echo $i
done
      

 
#include <iostream>

int main()
{
int arr[] = {1, 2, 3, 4};
for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
std::cout << arr[i] << "\n";
return 0;
}
_Winnie C++ Colorizer

 
#include <iostream>

int main()
{
for (auto i : {1, 2, 3, 4})
std::cout << i << "\n";
return 0;
}
_Winnie C++ Colorizer

 
module Main where

main = mapM_ print [1..4]
      

6 LOC   9 LOC   8 LOC   3 LOC

Для чого це потрібно? Іноді буває необхідно проітеруватись по enumeration. Не городити ж для цього масив, в кінці кінців...
PS: ага, і Shell, і плюсовий код теж можна в один рядок записати. Але ж читабельність...
madf: (Default)
Сьогодні раптово виявив що у хаскелевій System.Directory немає функції переміщення файлу. Є тільки перейменування.
Різниця суттєва: неможливо перейменувати файл так що нове розташування знаходиться на іншому фізичному пристрої. Помилка приблизно така:

rename: unsupported operation (Invalid cross-device link)

Вихід, звісно, простий:

moveFile :: FilePath -> FilePath -> IO()
moveFile source dest = copyFile source dest >> removeFile source
madf: (Default)
Викочував апдейти на сервер і випадково глянув у лог PostgreSQL.
В результаті оптимізував два запити, один у 1500 разів, інший майже у 3000 (з близько 1 сек до 0.9 мс і 0.3 мс відповідно). У другому випадку довелось трішки змінити код, заодно поприбирав catch який раніше імпортувався із Prelude.
madf: (Default)
BoostCon-2010:
Functional Programming in C++ (on chalkboard) by David Sankel
Functional Programming in C++ by David Sankel

C++Now!-2013 (свіжачок, конфа ще йде — сьогодні останній день!):
The Intellectual Ascent to Agda by David Sankel

Перші дві презентації спираються на C++03, так що деякі речі зараз можна виразити значно простіше. У останній презентації наводиться приклад коли дизайн розробляється у агдочці а потім на його базі пишеться код на C++. Якщо не помиляюсь, [livejournal.com profile] zamotivator колись писав про те що дизайнив шаблонні метапрограми у Scheme (чи іншому ліспі) а потім кодував на плюсах.
madf: (Default)
Bartosz Milewski підняв цікаву тему: як функтори, аплікативні функтори і монади допомагають боротися з інверсією управління при використанні асинхронного API (в контексті C++).
Відео: „Вступ і про функтори“, „Аплікативні функтори“, „Монади“.
Слайди: https://www.fpcomplete.com/wp-content/uploads/2012/09/Functional-Patterns.pdf
Read more... )
madf: (Default)
Прекрасне відео про нутрощі XMonad:

Продовження: http://www.youtube.com/watch?v=ivdyLaH3PhY&list=PLxj9UAX4Em-IBXkvcC3MycLlcxyoi7v8B&index=4
В основному мова йде про StackSet, структуру даних що керує вікнами і workspace'ами, і про Zipper. Показано принципи зневадження на реальному прикладі. Про Zipper зовсім трохи, поверхнево. Про нього краще почитати у Дона Стюарта (один із співавторів Real World Haskell і XMonad): https://donsbot.wordpress.com/2007/05/17/roll-your-own-window-manager-tracking-focus-with-a-zipper/
Там же є посилання на оригінальну працю Gerard’а Huet’а, який і придумав Zipper.
А у джерельних кодах XMonad можна знайти цитату самого Олега:
--    A Zipper is essentially an `updateable' and yet pure functional           
--    cursor into a data structure. Zipper is also a delimited                  
--    continuation reified as a data structure.                                 
--                                                                              
--    The Zipper lets us replace an item deep in a complex data                 
--    structure, e.g., a tree or a term, without an  mutation.  The             
--    resulting data structure will share as much of its components with        
--    the old structure as possible.                                            
--                                                                              
--      Oleg Kiselyov, 27 Apr 2005, haskell\@, "Zipper as a delimited continuation"
madf: (Default)
Є одна кльова софтинка, яку я давно використовую. Але мене задовбували у ній два дуже неприємних баги: хтозна-чого вона жерла CPU як не в себе, і її вікно іноді ховалось під інші вікна (хоча завжди повинне бути on top).

Спочатку я думав пофіксити швиденько баги (у мене були ідеї щодо high CPU consumption) і відправити патчі автору, але коли я глянув код... Коротше кажучи, простіше було її тупо переписати. Тому я форкнув її (GPL v. 3) і почав корячити. Відучити її жерти проц було нескладно, мої підозри підтвердились (колись давно я таке саме робив для Psi). І здавалось що і ховання під іншими вікнами вдалось виправити. Я „причесав“ код, трохи відрефакторив, зробив єбілд у локальному оверлеї і почав радіти життю.

Але виявилось що бага з хованням під вікнами так і залишилась. При чому я ніяк не міг визначити що саме викликає цю багу: одразу після старту все працює як треба, і тільки з часом вікно починає „ховатись“ — неначе соромиться... Я витратив купу часу намагаючись побороти цей баг, але марно. Тоді у мене закралась підозра що проблема у віконному менеджері — XMonad.
Якщо вам не страшний код на Haskell можете зазирнути під кат )

C++, Maybe

Dec. 23rd, 2012 08:46 pm
madf: (Default)
Колись, якщо я не помиляюсь, [livejournal.com profile] ivan_gandhi писав що методи get це зло. На жаль, я того посту знайти не можу. Пам’ятаю тільки що у коментарях хтось як альтернативу запропонував методи with. Я тоді не звернув увагу.
Не знаю, не знаю... )
madf: (Default)
read виявився вельми небезпечним. На ньому "лажає" строга типізація.
Prelude> (read "1.0") :: Double
1.0
Prelude> (read "1.0") :: Maybe Double
*** Exception: Prelude.read: no parse

Логічно, в принципі. Але фіг відловиш таку помилку. А через таку дрібничку більше доби не працював сервіс :(

PS: Зате зробив нормальне журналювання.
madf: (Default)
Реализация конструирования N-грамм и генерации псевдо ЕЯ-текста на их основе на языке Haskell
Перли:
ПОКАТЬ
ТОЛИЗЯМАРЦЕЛИЙ
ХРУЧАКЕКАВЕТОБЕРНОЛЬМ
НАХ ПОРЕЖДУГИ ПОХ
Ну і коронне:
СИНЬОР ЛОРЕНЦО КОЗЛЮБИМЫЙ ГРУБО И ЕСТАТЬСЯ БЛИ
madf: (Default)
Сьогодні після чергового незначного допилювання xmonad.hs він при компіляції показав мені смачну і велику дулю: Could not find module: `XMonad.Prompt.AppendFile'.
Solution: haskell-updater --all. Чомусь -u не допоміг.
Відкрив для себе tabbed layout. Правда, поки не придумав де його можна застосувати. Мабуть для full-screen applications тіпа firefox чи okular.
madf: (Default)
Вчора осилив Parsec. Після Boost.Spirit такі штуки мене вже більше не дивують. Вражає лише лаконічність коду: BNF перекладається майже без проблем. Із ghci дуже зручно тестувати парсери і їх комбінації (вихлоп g++ при помилках у Boost.Spirit мене досі лякає).
Коротше кажучи, приємна і зручна у користуванні бібліотека.
Цікаво те що і Parsec і Boost.Spirit у мене випливли в одному й тому ж проекті. Сам проект на C++, а одну маленьку утиліту вирішив спробувати написати на Haskell (отримавши натхнення від статті Дмитра Астапова "Давно не брал я в руки шашек"). Низхідне проектування майже вийшло, тільки в кінці на одній функції застряг. Треба буде пошукати як прийнято у Haskell обробляти помилки.
madf: (Default)
Виправив 1 помилку на HaskellWiki і зробив одне покращення.
Стаття: X window programming in Haskell
Помилка була у передостанньому прикладі. А саме - був відсутній виклик initThreads (аналог XInitThreads) що призводило до спонтанних падінь програми.
Покращення стосується потоку відправки подій Expose. У старій версії такий потік (нитка?) створювався на кожну подію у updateWin, в результаті потоки множились без міри (наприклад якщо часто клацати мишкою по вікну). Я зробив sendExposeEvent рекурсивною і виніс forkIO із updateWin у main.
Моя перша правка :)
madf: (Default)
Коли починаєш цікавитись якоюсь специфічною темою починаєш помічати цю ж тему у інших знайомих (очно чи заочно) тобі людей.
Цей тиждень у мене пройшов у розборках з монадами. І тут на тобі: Микола Стрєбков теж пише про них :)
Свій власний "туторіал" на цю тему я напишу пізніше. А може й не напишу.

GHC

Nov. 14th, 2009 12:37 pm
madf: (Default)
Glasgow Haskell Compiler написано на Haskell. Таким чином для того щоб зібрати GHC потрібно зібрати GHC, зібраний за допомогою GHC... І ніяк не вирватись із цього порочного круга!
А все просто насправді:
$ ls -l /usr/portage/distfiles/ghc-*
-rw-rw-r-- 1 portage portage  7072545 лис 14 10:46 /usr/portage/distfiles/ghc-6.8.2-src.tar.bz2
-rw-rw-r-- 1 portage portage 30872949 лис 14 10:51 /usr/portage/distfiles/ghc-bin-6.8.2-x86.tbz2
-rw-rw-r-- 1 portage portage   940742 лис 14 10:51 /usr/portage/distfiles/ghc-bundled-readline-5.2_p13-x86.tbz2
madf: (Default)
Ввечері обговорювали з murkt'ом вкид лайна на вентилятор останный пост від [livejournal.com profile] zabivator'а, і murkt кинув посилання на пару лямбда-котів. Я там навіть пару фоток від Дмитра Астапова aka [livejournal.com profile] _adept_ бачив :)

Profile

madf: (Default)
madf

April 2017

S M T W T F S
      1
2345678
9101112131415
1617 1819202122
23242526272829
30      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 19th, 2017 03:09 pm
Powered by Dreamwidth Studios