Pull to refresh

Comments 25

Я думаю стоит перенести это в блог Lisp.
К сожалению не хватает пока кармы
и как hands on ощущения? мне пока еще не удалось потрогать clojure основательно, но из того что пробовал — сильно раздражали запутанные сообщения об ошибках.
UFO just landed and posted this here
Не холивору для, а из любопытства. Я стараюсь при решении задач, требующих многопоточности, извернуть всё в сторону immutable state и сообщений. Есть ли какой то класс задач, который решается эффективнее с использованием изменяемого состояния и STM? То есть куда бы посмотреть чтобы цокнуть языком и сказать «Ай да STM, ай да сукин сын!»?
UFO just landed and posted this here
Очень удобно — уже 2 года как перешел с Питона на Clojure для небольших одноразовых скриптов. Правда, ничего длиннее сотни строчек пока не писал.
(range 1000) — последовательность чисел от 0 до 999


Но ведь задача 1 требует искать среди чисел от 1 до 1000, а 1000 как раз делится на 5. Почему же получается правильный ответ?
в оригинале условие звучит так — Find the sum of all the multiples of 3 or 5 below 1000, то есть не включая 1000
> Для этого очень хорошо подходит Project Euler.
Для меня тоже было радостью найти этот сайт, но так как я плохо знаю английский — я очень быстро потерял к нему интерес. А пару месяцев назад я нашёл русский, но намного улучшенный, вариант. Там кроме переведённых задач из Проекта Эйлера есть ещё и задачи по математике, физике и химии =)

Собственно, линк: Задачи для тренировки ума и продления жизни
Первые задачи ну совсем уж просты. Если хочется получить настоящее представление о projecteuler надо начинать с седьмого десятка. Или даже просто идти с конца, сделав последние 25 можно даже в рейтинг попасть.
Для самого начала изучения языка первые задачи лучше подходят. Потому что у меня было очень долго проблема написать тот же поиск 10001 простого числа, который работал бы достаточно быстро. Я хорошо представляю как это можно сделать на java/c++, но на clojure не представлял. И именно первые задачи и помогли немного в этом.
UFO just landed and posted this here
А есть ли смысл использовать Clojure там, где не нужна сложная логика распараллеливания вычислений, или лучше взять что-то другое?

Начал изучать этот язык, и впечатления пока не очень:
императивная парадигма почти не поддерживается, функциональная поддерживается слабо (отстутсвие TCO накладывает существенные ограничения, ничего серьезного в монадическом стиле написать не получится т.к. на больших объемах данных будет риск схватить StackOverflow).

Так же столкнулся с кучей мелочей, например let поддерживает деструктивное присваивание, а let* почему-то нет; так и не понял как определять взаимно-рекурсивные функции — та функция, которая выше по коду ругается что ничего не знает о той, которая ниже. Да и от «лишних» скобочек в let, case и т.д. по моему отказались зря.

В общем, пока не вижу что кроме хорошей интеграции с JVM и простотой распараллеливания программ могло бы выгодно выделить Clojure на фоне других языков.
UFO just landed and posted this here
Странное решение 1-й задачи, как правило, для этой классической задачи ставят жесткие временные рамки(коих на проекте Эйлера нет, но тем не менее), поэтому ее решают более оптимизированно — выбирают каждый третий + те у которых 0 или 5 в конце.
Если говорить об оптимизации, то в первой задаче программу писать не нужно вообще. Можно на бумажке посчитать.

(1 + 2 +… + 333) * 3 + (1 + 2 +… + 199) * 5 — (1 + 2 +… + 66) * 15 = 333*334/2 + 199*200/2 + 66*67/2 = дальше нужен калькулятор :)
Да, так побыстрее будет :) Только тут очепяточки в продолжении :)

(1 + 2 +… + 333) * 3 + (1 + 2 +… + 199) * 5 — (1 + 2 +… + 66) * 15 = 333*334*3/2 + 199*200*5/2 - 66*67*15/2
сумма чисел 1..n ищется по формуле.
Смотрите внимательнее. Тут она как раз и используется.
Знаю лисп на уровне первых нескольких глав любой книге о лиспе. Из статьи (раз уж решились разъяснять что значит каждое выражение) не понятно что значит #.

Так же не совсем понял назначения квадратных скобок, зачем было портить такую идеальную грамматику какими — то левыми квадратными скобками, которые по сути означают обычный список… во всяком случае так мне показалось пробежавшись глазами по примерам. Или они обозначают нечто такое особенное? Объясните :)
нотация #( bla-bla %) — это просто синтаксический сахар для обьявления анонимной функции, % — это параметр (если параметров несколько, используются %1 %2 и тд). То есть #(< % 4000000) эквивалентно (fn [item] (< item 4000000))

Квадратные скобки используются как для записи векторов, так и для списков параметров функции. Насчет идеальной грамматики — тут у каждого своя точка зрения ) мне наоборот кажется что код на Clojure благодаря разнообразным скобкам (есть еще фигурные для hash-map-ов) читается легче чем, скажем, Scheme. Но это, повторюсь, мое личное мнение.
Sign up to leave a comment.

Articles