This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2015-12-04
Channels
- # admin-announcements (6)
- # alda (1)
- # announcements (3)
- # aws (4)
- # beginners (233)
- # boot (82)
- # cider (11)
- # cljsjs (21)
- # cljsrn (7)
- # clojure (262)
- # clojure-japan (1)
- # clojure-russia (129)
- # clojure-sg (2)
- # clojure-taiwan (2)
- # clojurecup (23)
- # clojurescript (162)
- # clojurex (3)
- # core-async (18)
- # cursive (81)
- # datavis (183)
- # datomic (23)
- # emacs (2)
- # funcool (25)
- # ldnclj (82)
- # lein-figwheel (3)
- # om (196)
- # onyx (74)
- # parinfer (7)
- # portland-or (12)
- # re-frame (60)
- # reagent (48)
- # slack-help (1)
- # yada (9)
Всем привет. снова я. снова с макросом. Вопрос - при проверке (run (lxmWHILE) "while") вывод - {:value {:value "while", :lang :en}, :pos 1, :type #object[loxy.core$lxmWHILE 0x5a5f0fa9 "loxy.core$lxmWHILE@5a5f0fa9"]} какое заклинание надо сказать что бы вместо #object[loxy.core$lxmWHILE 0x5a5f0fa9 "loxy.core$lxmWHILE@5a5f0fa9" было lxmWHILE? макрос тут - http://pastebin.com/bAJ3qXmN
@wwall: а почему ты для p-name кастуешь (str lex-name) а для остальных нет?
(map (fn [[x y]] x)) ru-parser-data )
-> (map first ru-parser-data)
wwal: я же писал. у тебя должна быть функция, которая принимает на вход word и возвращает функцию. тебе не нужны тут макросы
ты предлагаешь сделать 40 одинаковых функцих которые отличаются только последовательностью сиволово которые парчиться
wwall: если ты опишешь задачу, покажешь эти defparser и что ты тут вообще используешь мы можем попробовать сделать это все по-другому. я тебе об этом вчера писал
wwall: это не дела вкуса. ты пишешь хреновый код. сложный, не поддерживаемый, не компоузебл
то что есть сейчас - http://pastebin.com/XfPjqa6g граматика языка на инстапарсе - http://pastebin.com/SzpJwMDc
вот у тебя есть:
(defmacro deftoken-char
[lex-name char-parser]
(let [p-name (make-sym (clojure.string/join [lex-name ""]))]
`(defparser ~lex-name
[] (let->> [start# (lineno) v# (char ~char-parser)] (always {:type '~p-name :pos start# :value v#})))))
(deftoken-char lxmPLUS \+)
Ровно то же самое можно выразить так:
(defn token-char
[lex-name char-parser]
(let->> [start (lineno) v (char char-parser)]
(always {:type lex-name :pos start :value v})))
(defmacro deftoken-char
[lex-name char-parser]
`(defparser ~lex-name [] (token-char '~lex-name ~char-parser)))
(deftoken-char lxmPLUS \+)
я не понимаю. твой макрос полностью эквиалентен тому что я написал, возвращаются абсолютно одинаковые парсеры.
ну вот смотри. тут мы во первых избавляемся от странного (т.е. от (make-sym (clojure.string/join [lex-name ""]))). во-вторых четко разделяем процесс формирования собственно парсера (функция token-char) и синтаксической обвязки (макрос deftoken-char)
и главное этим куда понятнее рассуждать, ты вот этой token-char можешь оперировать как обычной функией, передавать ее куда-то, т.е. собственно получать профиты ФП
все эти choice это тоже обычные функции, ты им можешь как обычным функциям скармливать какие-то наборы аргументов без использования макросов
deftoken посложнее, но я пока не вижу причин почему ему не быть написаным в этом же стиле
вообще на сколько я помню это стандартный путь у любого кто с кложурой/лиспом работает: 1 Макросы это магия, не буду юзать их 2 Макросы это супер магия - буду везде их юзать! 3 Макросы совсем не магия, буду юзать их тока когда надо
ну по крайней мере у меня так было:)
а -> ->> макросы?
and
тоже макрос, помню для меня было открытием
ну еслиб and былоб функцией то тако бы тяжело было писать
if (something && something.call()) ...
если б and
был функцией а не макросом то
(and something (something else))
сначала бы заэвалуэйтил оба аргумента
ага. Но я помню вначале был удивлен, потом дошло да
+ в языках которые позволяют тебе отложить выполнение нужного аргумента — тоже. по-идее в скале and можно реализовать как функцию
оу, скала на столько ленива? не знал
надо почитать про нее
scala> def and(left: => Boolean, right: => Boolean) = {
| if (left)
| if (right) true
| else false
| else false
| }
and: (left: => Boolean, right: => Boolean)Boolean
scala> and(true, { println("hello"); true})
hello
res2: Boolean = true
scala> and(false, { println("hello"); true})
res3: Boolean = false
ха, круто
как тебе скала кста вообще?
для начинающих: подскажите пожалуйста, есть map с массивом
{:users [{:id 1} {:id 2}]}
как проще всего добавить в массив новые ключи со значениями из другого массива, т.е. есть массив [7, 8], чтобы в итоге получилось {:users [{:id 1 :prop 7} {:id 2 :prop 8}]}
, спасибозиппер моно так-то
типа (walk #(if (:id %) (assoc % :prop 7) (identity %))
не проверял в репле тоже
а, тут же разные еще значения нужно - неа, тада зиппер будет тут не красиво
(let [m {:users [{:id 1} {:id 2}]}]
(assoc m :users (map #(assoc %1 :prop %2) (:users m) [7 8])))
> (map #(merge %1 {:prop %2}) (zip x [7 8])) подозреваю, как-нибудь так ну т.е. да, только я не знаю откуда тут ты zip взял (очевидно, не из кложи), а zipper тут вообще не нужен
zip (rb,py) -> interleave
(clj) но map лучше подходит, можно еще update / update-in использовать - (update m :users (fn [xs] (map #(assoc %1 :prop %2) xs [7 8]))
вопрос по клиентскому роутингу в cljs (secretary): почему в SPA используется не “клиентская” часть урля (после #) а обычный path? проблема в том, что при принудительном рефреше страницы сервер пытается отдать “несуществующий” ресурс. по идее SPA сервер должен уметь отдавать одну страничку, а остальное разруливается клиентским роутингом. решётка была бы кстати. а так получается нужно сервера учить клиентским маршрутам. грешновато как-то, не?
то есть на сервере придётся под каждый клиентский рут отдельный компожурный мэпинг заводить, хм
думал это через # обойти, но секретарь с ними как-то не особо дружит, да и, судя по переписке там, народ считает, что hashless URLs это правильный путь. я как-то не очень понимаю этой философии
Думаю там у секретари настроечка должна быть или возьми route-map его можно использовать на обоих концах ;)
@turtle: Пока нет, но счас делаю как раз пример для ом-некста под иос
"секретарь с ними как-то не особо дружит” - оказалось, это не secretary, a accountant (небольшая либа вокруг него, она по дефолту в lein new reagent вписана). там у чуваков очень сильное мнение, что урли с хэшами это зло запатчил, попробую там спросить в чём философия
да особо не решали ничего ) я вчера решил посмотреть, что реагентный темплейт умеет, там секретарь с бухгалтером используются. гляну на bidi, спасибо
даем обратную связь http://blog.cognitect.com/blog/2015-clojure-community-survey
Коллеги, возник вопрос. Как вы в своих организациях собираете проэкты? Сейчас пытаюсь внедрить Clojure в своей организации, как билд сервер тут используется Jenkins. Существует плагин https://wiki.jenkins-ci.org/display/JENKINS/leiningen+plugin но на сколько я помню он был косой и кривой и не думаю, что стал лучше учитывая, что Latest Release Date: Sep 25, 2013
эм, у нас докер с лейном просто
или о чем-то другом вопрос?
@artemyarulin: то есть вы собираете уже внутри докеровского контейнера ?
у меня так не получиться … хотят чтобы бегало на алекейшен(wildfly) сервере… так что админам надо отдавать уже готовый .war файл
аа, тада хз, сорри
chort409: я не много не в теме, но я не понимаю, что именно нужно от интеграции с женкинсом? вот старый плагин, ок. нафига он нужен? каких возможностей не хватает? чем не нравится сборка war-а просто через баш?