ЦеНеБлог

Clojure

17 липня 2012

(Лінь [])

Написав невеличкий макрос, що дозволяє створювати ліниві послідовності в стилі loop-recur.

    
(defmacro lazy-loop [params & body]
(let [[args argvals] (->> params (partition 2) (apply map list))] `(letfn [(~'lazy-recur [~@args] (lazy-seq ~@body))] (~'lazy-recur ~@argvals))))

Приклад використання:

user=> (lazy-loop [a 5] 
(if (> a 0)
(cons a
(lazy-recur (dec a))))) (5 4 3 2 1)
user=> (lazy-loop [i (range)
m [0 0 1 1 0 1 0 1]]
(if (seq m)
(if (= (first m) 0)
(lazy-recur (rest i) (rest m))
(cons (first i)
(lazy-recur (rest i) (rest m)))))) (2 3 5 7)

lazy-recur — просто ім'я функції для рекурсивного виклику; вимог щодо хвостової позиції нема, але (оскільки результатом lazy-loop має бути або послідовність, або nil) доречно розміщувати його останнім елементом у cons чи concat, що повертається як результат, або в хвостовій позиції.

Автор: Python. Опубліковано 17 липня 2012 12:40
Змінено 17 липня 2012 12:46
Категорії: Clojure, Програмерство

18 квітня 2012

Парне програмування для команди з одного програміста

Кожен, кому доводилось програмувати самому (не для роботи чи диплому, а просто для себе), може розповісти, наскільки це довгий і неефективний процес. І справа навіть не в тому, що один програміст може зробити менше, ніж десять (в чомусь це навіть перевага: ніхто не плутається під ногами, а епохальні речі взагалі часто створювались малими командами чи окремими індивідами) — проблема в відсутності необхідності зробити роботу вчасно. Ну, не написав ти сьогодні рядок коду, не напишеш завтра, через місяць забудеш про свої наміри — що з того? Ніхто тебе не змусить дописувати власні геніальні творіння, та й чи треба?.. А на диску збираються чорновики недописаних фрагментів коду, і збираються роками, чекаючи, коли їх хтось почне колошматити...

Досить. Треба щось робити — або забити на те, що ти програмер, і знайти якесь простіше хоббі, або нарешті змусити себе працювати. Не годувати себе медитаціями в стилі «ти можеш, ти сильний, ти не настільки ледачий» (ти справді ледачий, як і всі люди, якщо ця проблема для тебе є проблемою), не картати себе («О, ти сьогодні дивився в стелю цілий день і цілу ніч, бери й роби, ледащо!»), не морочити собі голову в якийсь інший спосіб. Коротше, треба просто розібратися, щó заважає тобі рухатись, і по можливості усунути цю перешкоду. Методика обходу перешкоди має бути реалістичною. Безглуздо вчити страуса літати, щоб він міг перелетіти через гори, зате варто подумати, як застосувати його біговий скіл, розпланувати маршрут пробігу і т.д.

Читати далі...

Автор: Python. Опубліковано 18 квітня 2012 21:39
Змінено 01 вересня 2012 3:46
Категорії: Clojure, Програмерство, Філософія

22 листопада 2011

Clojure 1.3 (все в одному)

Ті, хто програмують на клоӂурі, вже могли чути про зміни, що з'явились в останній версії. Зокрема, замість єдиної бібліотеки clojure.contrib тепер використовуються окремі модулі, розкидані по різних репозиторіях. Важко сказати, в чому переваги такого підходу — економія дискового простору, більша гнучкість розробки... Звичайно, якщо програміст для збирання свого великого й складного проекту використовує lein чи maven, особливої різниці він може й не відчути: в масштабах такого проекту, налаштування залежностей — найлегша частина роботи. Зрештою, може бути так, що для роботи вистачає й основних біліотек clojure, без contrib. Я ж не стільки пишу робочий код, скільки вивчаю й експериментую в REPL (тобто, проектів як таких здебільшого нема — лише маленькі програмки з одного файла) — мені зручніше, коли все необхідне лежить в одному архіві, і я можу спробувати ту чи іншу можливість, не тратячи час на конфігурування та встановлення додаткових пакетів. Власне, ось:

Скачуєте, розпаковуєте. Для запуску — clojure.bat (для тих, хто користується лінуксом, цей варіант не підходить, але, гадаю, аналогічний баш-скрипт написати нескладно). Збірка включає в себе базові бібліотеки clojure та більшість модулів з clojure.contrib , їх можна підключати безпосередньо за допомогою use — якихось додаткових налаштувань за межами програмного коду робити не треба. Може, це й не відповідає філософії справжнього програміста, але мені так зручніше.
30.11.2011 — до збірки додано модуль algo.generic, якого раніше не було в репозиторії.

Читати далі...

Автор: Python. Опубліковано 22 листопада 2011 5:29
Змінено 16 грудня 2011 16:39
Категорії: Clojure, Download

| Download »