Fork me on GitHub
#clojure-russia
<
2016-07-27
>
andmed09:07:38

про higher order functions -- имплементирую comp Нужно чтобы

(is (= ((COMP list +) 2 2) (list (+ 2 2))))
Написал
(defn COMP [f & rest]
  (if (nil? rest)
    f
    (apply f (COMP rest))))
Ага. нифига не работает конечно. Подглядел как у других и в тч реализацию оригинала -- конечно там сложнее. А мой код тада что делает?

andmed09:07:45

и без apply тож... а так клево выглядит

andmed09:07:24

оригинал вроде функция, не макрос

kronos_vano09:07:51

в оригинале через хитрый редьюс

kronos_vano09:07:04

а тут рекурсия

comerc10:07:28

a = b : c : 1
result = a?.b?.c or "sorry"

comerc10:07:57

это на CoffeeScript, а как такое повторить на Clojure?

razum2um10:07:31

@comerc: keyword так себя ведут по умолчанию с nil

(let [a {}] (-> a :b :c (or "sorry")))
“sorry”

seryh10:07:28

поправил

(let [a {:b 4}] (-> a :c (or (a :a) (a :b) "sorry"))) ;; => 4

seryh10:07:41

user=> (let [a {:c 3}] (-> a :b :c (or "sorry")))
"sorry"

comerc10:07:24

@seryh: поясни, чего поправил? я проверял, вроде все работало.

seryh10:07:01

(let [a {:c 3}] (-> a :b :c (or "sorry")))
=> вернул "sorry" а не 3

misha10:07:12

a = b : c : 1 это var a = {b: {c: 1}} что ли?

comerc10:07:25

т.е. варианта [a {:c 3}] не может быть

comerc10:07:02

это борьба со следствием, а не с причиной

misha10:07:03

можно еще

(get-in a [:b :c :d :e] "sorry")

misha10:07:09

но последние пару месяцев я тоже через -> пишу, и формулы тоже

misha10:07:09

типа (def h (-> rows count inc (* db/HEIGHT)))

comerc10:07:41

мы этого еще не проходили 🙂

artemyarulin10:07:50

some-> няшный тоже

misha10:07:08

сам-> ништяк, да

comerc10:07:12

(let [a {:c 1}] (get-in a [:b :c] "sorry")) - во, а это работает правильно!

misha10:07:08

я тут такое вчера нашел!

cljs.user=> (print "yo")
yo
nil
cljs.user=> (def s (with-out-str (print "yo")))
#'cljs.user/s
cljs.user=> s
"yo"

artemyarulin10:07:05

я тоже это находил, тока не помню чтоб было нужно 🙂

misha10:07:44

в ios алёрт прити принтить словари kappa

comerc10:07:01

@misha: а как корректно изобразить (get-in a [:b :c :d :e] "sorry") с помощью ->?

misha10:07:24

(let [a {:c 3}] (-> a :b :c :d :e (or "sorry")))

misha10:07:21

(macroexpand-1 '(-> {:c 3} :b :c (or "sorry")))
(or (:c (:b {:c 3})) "sorry")

comerc10:07:42

@seryh: (let [a {:c 3}] (-> a :b :c (or "sorry"))) - тут все правильно, так и должно быть

comerc10:07:02

я напутал сам

seryh10:07:00

а , ок. мой пример перебирает ключи а не ищет вложения

seryh11:07:16

user=> (let [{{c :c} :b} {}] (or c "sorry"))
 "sorry"
user=> (let [{{c :c} :b} {:b {:c 3}}] (or c "sorry"))
3

seryh11:07:20

еще вариант

andmed12:07:04

@kronos_vano: рекурсия, но не композит функции почуму-то...

andmed12:07:40

композиция - последовательное применение функции к результату предыдущей, да? ну я это и делаю.. кажется

andmed12:07:38

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

misha12:07:26

@seryh: wtf is that?

seryh13:07:49

Деструктуризация же

savelichalex14:07:41

Парни, уже весь мозг сломал как сделать, может кто сталкивался. Хочу сделать в консольной утилите репл, собственно по простой и непринужденной конструкции

(print (eval (read-string (read-line))))
проблема в том что нужно в скоуп eval-a забиндить переменную одну, допустим это x. Вообще никак не получается. пробовал даже сделать ее (def ^:dynamic x nil) и потом через binding связать, не выходит. Постоянно пишет Unable to resolve symbol: x in this context

seryh14:07:56

@savelichalex: а

(resolve x)
не поможет?

razum2um14:07:37

я то же самое сделал в https://github.com/razum2um/clj-debugger

razum2um14:07:07

короче эвалить надо форму с явными биндингами локальных переменных

savelichalex14:07:34

@razum2um: хм, все дело в *locals*?

razum2um14:07:34

*locals* просто перечислит локальные переменные. фишка в том, что внутрь эвала нельзя прокинуть чтото типа объекта context (aka binding в рубях), приходится формировать обертку

savelichalex14:07:56

блин как будто эти переменные с ноги засовывают) спасиб @razum2um

artemyarulin17:07:21

ничо так, но я все равно не понимаю - во время разработки в репле подразумевается что я запущу clojure.spec/instrument в начале сессии для всех функций или по отдельности буду включать? или вообще тока в тестах?