Fork me on GitHub
#clojure-russia
<
2015-09-15
>
kirillov07:09:48

Друзья, кто с boot работал? Можете подсказать - как он работает с nfs-шарингом (nfs-shared-folders)? Я видел что у него есть поллинг на 10мс, но почему-то у меня он не отработал (((

kirillov07:09:57

кто-нибудь сталкивался с подобным?

maxp07:09:14

Насчет boot не подскажу.

maxp07:09:50

Есть другой вопрос, уважаемые.

maxp07:09:21

Представьте, что у вас есть десятор регулярок, по которым надо последовательно прогнать строку до совпадения.

maxp07:09:43

По совпадению вернуть то, что там сматчилось.

maxp07:09:02

Интересует наиболее элегантный способ.

ul08:09:14

((apply some-fn (map #(partial re-matches %) your-regexes)) your-string)

maxp08:09:26

Спасибо.

maxp08:09:52

Я, правда, не точно уловие описал.

maxp08:09:24

Там хочется не some-fn, а немного разные fn на каждый матч.

maxp08:09:52

то есть что-то типа

maxp08:09:22

[:тип-строки "что-там конкретно сматчилось"]

maxp08:09:23

то есть похоже что condp проще всего будет

ul08:09:32

можно сделать так: вместо your-regex сделать вектор не просто регулярок, но пар :тип-строки и регулярка

maxp08:09:44

хотя map идеологичнее

ul08:09:06

и тогда вместо #(partial re-matches %) будет (fn [k r] (fn [s] (when-let [x (re-matches r s)] [k x]))

maxp08:09:32

надо ведь map остановить по первому матчу

maxp08:09:45

то есть взять first видимо

ul08:09:11

ну если у тебя регярки одни и те же

ul08:09:32

то надо просто (apply some-fn ...) вынести отдльно

ul08:09:37

эта штука создаёт функцию

ul08:09:51

которая начинает перебирать матчи и останавливается на первом

maxp08:09:31

apply применяет функцию к аргументам

maxp08:09:48

или почему map будет останавливаться

maxp08:09:57

по first будет

ul08:09:23

(defn make-single-matcher [k r]
  (fn [s]
    (when-let [x (re-matches r s)]
      [k x])))

(def regexes [[:type1 #"..."] [:type2 #"..."] ...])

(def my-matcher (apply some-fn (map make-single-matcher regexes)))

(my-matcher "test-string)

ul08:09:29

v'g yt yflj jcnfyfdkbdfnm

ul08:09:34

мэп не надо останавливать

ul08:09:48

он создаст функции для каждого типа+регекса

ul08:09:08

а some-fn создаст другую функцию

ul08:09:24

которая будет пербирать их до первого матча на каждом вызове

maxp08:09:00

эээ...

maxp08:09:19

так, там значит мап наделает толпу матчеров

maxp08:09:49

а потом apply их куда денет?

ul08:09:59

скормит some-fn

maxp08:09:17

все зараз

ul08:09:19

если хочется оптимизации, то лучше просто через reduce

ul08:09:49

потому что first map из-за имплементации ленивых вычислений в кложе будет лишнее каждый раз считать

ul08:09:56

some-fn лучше в этом смысле

ul08:09:06

но хуже потому что создаёт толпу функций

maxp08:09:45

поняно

maxp08:09:07

а почему first будет лишнее считать?

maxp08:09:16

мапа же ленивая

ul08:09:25

она ленивая, но с чанками

ul08:09:31

она сначала чанк посчитает

ul08:09:37

а потом только first вступит в дело

ul08:09:50

так что если надо на спичках экономить, то лучше просто loop'ом пройтись

maxp08:09:20

тут не то чтобы дело в экономии, но просто сразу сделать более-менее правильно

maxp08:09:51

в принципе, some-fn мне подойдет

ul08:09:50

(defn match [krs s]
  (reduce (fn [_ [k r]]
            (when-let [x (re-matches r s)]
              (reduced [k x])))
          nil krs))

ul08:09:12

эффективнее и даже проще

ul08:09:10

reduce всегда приходит на помощь )))

ul08:09:20

@maxp: ^^^ мне этот вариант нравится больше тех, что я предложил до этого

maxp08:09:03

остановить по reduced?

maxp08:09:08

тоже вариант

ul08:09:26

ну да, вариант хорош тем, что не делает лишних вычислений, не плодит лишних функций

ul08:09:32

всё просто и прямо, и при этом мало кода

maxp08:09:49

да, неплохо выглядит

maxp08:09:02

мне бы еще вспомнить, как в регексах группы именуются...

maxp08:09:01

ведь мне надо определить тип строки и вытащить нужное, только и всего.

maxp08:09:23

что-то типа такого

maxp09:09:12

упс... не поддерживаются 😞

maxp13:09:54

не подскажет ли уважаемый all

maxp13:09:09

в чем тайный смысл вот такой конструкции

maxp13:09:10

(doseq [c text] (.write writer (int c))))

maxp13:09:44

при учете, что ^BufferedWriter writer и ^String text

ul13:09:43

строка в clojure utf-16, а BufferedWriter понимает только однобайтные

maxp13:09:24

о как!

maxp13:09:41

а я думал это уже все в далеком прошлом...

maxp13:09:59

в кложе явовские стринги

maxp13:09:23

то есть write(c) тоже должно как-то code point преобразоывавть к дофолтному енкодингу

maxp13:09:10

или можно на with-open кодировку указать?

ul14:09:03

тут я не силён, я просто посмотрел явовские доки для BufferWriter и потом нашёл на стэковерфлоу похожую проблему

ul14:09:39

можно файл попробовать как стрим открыть

ul14:09:48

стримы вроде поддерживают указание кодировки

maxp14:09:16

у меня валяется где-то доморощенная явовская библиотечка, где я всякие стримы кодировками оборачивал,

maxp14:09:41

но той либе лет 10 как минимум

dottedmag14:09:53

Господа, а кто-нибудь ещё использует кложу в качестве REPL'а для играния с Java?

maxp14:09:06

играния в каком плане?

maxp14:09:20

файлики почитываем, бывает

dottedmag14:09:25

Ну вот хочется понять, как работает то или иное. Берёшь репл, пробуешь.

dottedmag14:09:50

Я раньше страдал и писал куски .java, компилировал, исполнял. А кложа - это как раз репл для джавы нормальный.

maxp14:09:59

я раньше для этого вебсервер использовал, как это ни забавно simple_smile

maxp14:09:08

в смысле .jsp файлы

ul14:09:16

я так пробовал на зуб одну либу

ul14:09:41

но вроде в ней самой ничего не менял, поэтому не могу сказать, есть ли сложности с горячей подгрузкой кода в репл

maxp14:09:22

что-то я туплю, а кложа сама компиляет java файлы для загрузки?

dottedmag14:09:14

Нет, не компиляет. Для проверки того, как работает библиотека, джаву писать не нужно.

maxp14:09:54

ну если готовую либу, то может быть тогда, это не восем репл режим, конечно

maxp14:09:22

вебсервер можно попросить компилять все на лету

maxp14:09:39

там этакий репл получается, но по F5 simple_smile

maxp15:09:59

подскажите, уважаемые, а есть какой-нибудь сильно более эффектиыный способ собрать много строк, чем (conj [] "strNN")

maxp15:09:12

то есть юзкейс - в процессе работы накапливать где-либо строки, а потом их всей кучей слить куда-либо

maxp15:09:08

в коде

maxp15:09:25

(let acc (atom []) ....

maxp15:09:37

(swap! acc conj mystr1)

maxp15:09:02

в конце-концов что-то вроде (str/join " " @acc)

niquola17:09:33

@maxp java interop for rescue