Clojure impresses

Dec 10, 2012 14:58

Нашему Clojure-проекту исполнилось полгода, из них последние три месяца его используют заказчики. Пора подводить промежуточные итоги ( Read more... )

наглядный пример, девелопмент, инструментарий, clojure, fp, и такое было

Leave a comment

ext_1405098 December 10 2012, 12:01:27 UTC
"""Макросы - простые и понятные пушистые зверьки, позволяющие кое-где срезать углы или отложить вычисления."""

Отложить вычисления можно через замыкания. Бывают какие-нибудь полезные применения макросов, не сводящиеся к замыканиям?

Reply

sorhed December 10 2012, 12:07:14 UTC
1) type providers, хотя к Кложуре это не относится.

2) настройка синтаксиса под себя, создание DSL. Замыканиями тупо неудобно пользоваться.

То есть так рассуждать, то можно докатиться до «всё равно всё процессор исполняет, давайте писать тупо на ассемблере». И некоторые ведь пишут, что самое ужасное.

Reply

tonsky December 10 2012, 12:24:16 UTC
Не создавать замыкания.

Плюс, я ж говорю - срезать углы. Есть разница между:

(->> (f x)
json/parse-json
(map #(g %))
(remove nil?))
и

(let [y (f x)
y1 (json/parse-json y)
y2 (map #(g %) y1)
y3 (remove nil? y2)]
y3)

Reply

lionet December 10 2012, 12:48:17 UTC
Haskell

Было:

f . g = \x -> f (g x) -- Часть стандартной библиотеки

-- Наш код, data flow справа налево
proc = filter (not null) . map g . JSON.parseJson . f

Стало (развернули):

infixr 9 →
f → g = \x -> g (f x) -- Придумали сами такое

-- Переписали код, чтобы data flow шёл слева направо.
proc = f → JSON.parseJson → map g → filter (not null)

Итого, простейшая функция меняет control flow. Почему это важно? Потому что показывает, что в твоём примере макрос не имеет большого смысла, достаточно просто функции. Даже не замыкания, а простейшей функции.

Reply

tonsky December 10 2012, 13:14:00 UTC
Там два макроса, один протаскивает значение через первый аргумент всех функций, другой через последний. Что-то мне подсказывает, что в Хаскеле только один из них легко реализуем.

Если все функции одноаргументные, то да, достаточно comp. Если это не только функции, а еще и спец. формы или интероп, то макрос все-таки более универсальный и безгеморройный способ.

Reply

lionet December 10 2012, 13:40:51 UTC
Мощь лисповых макросов не оспариваю. Но в существенной степени она лечит именно лисповые закидоны. Например, функции на хаскеле структурированы так, что нужно тащить именно последний аргумент. В редком случае, когда это не так, их можно быстро привести к этому виду (функцией же). Итого, периодическую необходимость протаскиваниея первым аргументом считаем особенностью именно кложи.

Как начинается интероп и пр., появляются монады в дискурсе. Синтаксически это выглядеть будет так же просто, как в лиспе (только без скобок), но опять же, type-sound и написано на одних функциях, без замыканий.

Впрочем, быстрее понять, как макрос наколбасить (или применить существующий), нежели начать уметь такую монаду делать. Разница в learning curve не в пользу Хаскеля.

Reply

levgem December 10 2012, 15:27:48 UTC
это юникодный символ в исходниках?

Reply

lionet December 10 2012, 18:06:44 UTC
Да.

Reply

levgem December 10 2012, 18:08:12 UTC
у всех кнопка настроена на него?

Reply

lionet December 10 2012, 18:20:10 UTC
Ctrl-C? Да. Но вообще ничто не мешает назвать его >>>, например. Это не принципиально, я хотел лишь подчеркнуть смену направлений.

Reply

tonsky December 10 2012, 18:43:34 UTC
ext_857471 December 10 2012, 14:30:04 UTC
Макросы используются для создания синтаксических конструкций языка. Раскрытие макроса, в отлиие от функций, происходит во время компиляции, а не в рантайме. Отсюда экономия времени в рантайме.

Reply

lionet December 10 2012, 14:55:55 UTC
Макросы в лиспе способны создать только одну синтаксическую конструкцию. А именно, синтаксис лиспа.

Reply

ext_857471 December 10 2012, 15:10:35 UTC
Глупый неаргументированный вброс.

Reply

thesz December 10 2012, 15:00:03 UTC
Против макросов у меня два возражения: трудность диагностики ошибок и непервоклассность. Вы не можете создать значение "частично применённый макрос".

Значение "частично параметризованная функция" создаётся просто замечательно. Более того, раскрывается во время компиляции, а не во время исполнения, экономя время программиста и пользователя.

Reply

vinslivins December 10 2012, 16:12:05 UTC
эм. а можно ли в хаскеле создать "частично применённую функцию", или даже "частично сконструированный тип", а потом как-то узнать частичное значение?

data Book = Book Int String

b = Book 2

можно ли как-то достать значение 2 ?

Reply


Leave a comment

Up