Size: a a a

Emacs — русскоговорящее сообщество

2020 November 02

A

Aragaer in Emacs — русскоговорящее сообщество
тут чот ни loop ни doseq не подходят, потому что для doseq тут нужна мутабельность по параметру
источник

AP

Alex Peresmeshnik in Emacs — русскоговорящее сообщество
Aragaer
куда копать, чтобы на кложе сделать "цикл" вида "взять первую запись в мапе, выполнить функцию, куда дополнительно передать параметр Х. Получить из функции значение Х1. Взять вторую запись, вызвать функцию, но туда уже передать Х1 и так пока не кончится мапа"?
В схеме для такого есть call/cc :)
источник

A

Aragaer in Emacs — русскоговорящее сообщество
ээ
источник

A

Aragaer in Emacs — русскоговорящее сообщество
не, вроде не то
источник

A

Aragaer in Emacs — русскоговорящее сообщество
во, придумал через loop, причем один из аргументов это список ключей, которые пока не потрогали
источник

DL

Dmytro Lispyvnyi '(🌲... in Emacs — русскоговорящее сообщество
Aragaer
куда копать, чтобы на кложе сделать "цикл" вида "взять первую запись в мапе, выполнить функцию, куда дополнительно передать параметр Х. Получить из функции значение Х1. Взять вторую запись, вызвать функцию, но туда уже передать Х1 и так пока не кончится мапа"?
тебе reduce-kv штоле надо?
источник

A

Aragaer in Emacs — русскоговорящее сообщество
(defn distribute [amount distribution]
 (loop [total-amount amount
        keys-left (keys distribution)
        total-weight (reduce + (vals distribution))]
  (if (= total-weight 0)
    total-amount
    (let [key (first keys-left)
          weight (get distribution key)
          amount (/ (* total-amount weight) total-weight)
          used (key amount)]
      (recur (- total-amount used)
             (rest keys-left)
             (- total-weight weight))))))
источник

A

Aragaer in Emacs — русскоговорящее сообщество
вот такое накодячил
источник

A

Aragaer in Emacs — русскоговорящее сообщество
но видимо да
источник

A

Aragaer in Emacs — русскоговорящее сообщество
хм, похоже, да
источник

DL

Dmytro Lispyvnyi '(🌲... in Emacs — русскоговорящее сообщество
Aragaer
(defn distribute [amount distribution]
 (loop [total-amount amount
        keys-left (keys distribution)
        total-weight (reduce + (vals distribution))]
  (if (= total-weight 0)
    total-amount
    (let [key (first keys-left)
          weight (get distribution key)
          amount (/ (* total-amount weight) total-weight)
          used (key amount)]
      (recur (- total-amount used)
             (rest keys-left)
             (- total-weight weight))))))
вместо first/rest можно прямо в биндах loop-а декструктурить
источник

PG

Pig Greenest in Emacs — русскоговорящее сообщество
> recur
источник

DL

Dmytro Lispyvnyi '(🌲... in Emacs — русскоговорящее сообщество
[current-key keys-left] (keys distribution)
источник

A

Aragaer in Emacs — русскоговорящее сообщество
ага, норм, работает
источник

A

Aragaer in Emacs — русскоговорящее сообщество
надо только после reduce-kv вытащить нужное из полей
источник

A

Aragaer in Emacs — русскоговорящее сообщество
ща
источник

A

Aragaer in Emacs — русскоговорящее сообщество
(defn distribute [amount distribution]
 (first
   (reduce-kv
     (fn [[total-amount total-weight] key weight]
       (if (= total-weight 0)
         [total-amount 0]
         (let [amount (/ (* total-amount weight) total-weight)
               used (key amount)]
           [(- total-amount used) (- total-weight weight)])))
     [amount (reduce + (vals distribution))]
     distribution)))
источник

A

Aragaer in Emacs — русскоговорящее сообщество
то есть у меня по цепочке передаются total-amount и total-weight и по пути уменьшаются
источник

A

Aragaer in Emacs — русскоговорящее сообщество
а в итоге total-weight падает в 0, а total-amount надо вернуть
источник

DL

Dmytro Lispyvnyi '(🌲... in Emacs — русскоговорящее сообщество
Aragaer
а в итоге total-weight падает в 0, а total-amount надо вернуть
key лучше не использовать в качестве локального имени
источник