Proszę, wyjaśnij mi następujący kod Xml

znalazłem poniższy kod (w ten blog co decyduje Moneta Zmiany Kata):

(defn change-for [amount]
  (let [denominations [25 10 5 1]
        amounts (reductions #(rem %1 %2) amount denominations)
        coins (map #(int (/ %1 %2)) amounts denominations)]
    (mapcat #(take %1 (repeat %2)) coins denominations)))

część, którą uważam za trudne, to:(reductions #(rem %1 %2) amount denominations).

jak dowiedziałem się, skrót po prostu oblicza wynikowego kolekcję stopniowo na bazie jakiejś określonej funkcji. Przykład: (reductions + [1 2 3]) daje [1 3 6].

1         ; first  element
1 + 2     ; second element
1 + 2 + 3 ; third  element

następny funkcjarem który oblicza resztę nadal jest niezwykle łatwy do zrozumienia.

aby zrozumieć resztę kodu, próbowałem następujący:

; first try, to see if this call works
; outside the original code (the change-for function)
(reductions #(rem %1 %2) 17 [10 5 1]) ; --> [17 7 2 0]

; tried to use the reductions which takes only one argument
; notice that 17 is now inside the array
(reductions #(rem %1 %2) [17 10 5 1]) ; --> [17 7 2 0]

; further simplified the expression
(reductions rem [17 10 5 1]) ; --> [17 7 2 0]

ostatnim krokiem było usunięcie funkcji anonimowej, jak opisano w ten blog.

tutaj wszystko plącze się (przynajmniej dla mnie): rem przyjmuje 2 argumenty, i nie rozumiem, jak są one stosowane przy użyciu tablicy [17 10 5 1]. Ja próbowałem następujące połączenia:

(rem [17 10 5 1]) ; --> gives error
(rem [17 10 5 1] [17 10 5 1]) ; --> also gives error
(rem 17 10) ; --> works, but how do you use it with collections?

może mi ktoś wytłumaczyć, jak to działa ?

jeszcze jedna rzecz, której nie rozumiem, to: jak stosuje się te procentowe argumenty (w #(rem %1 %2))? Mam na myśli to, skąd one się biorą? Próbowałem się dodzwonić rem w następujący sposób, ale otrzymuję komunikat o błędzie: (#(rem %1 %2) 17 [10 5 1]). Musi być coś ... -Funkcja -11--> robi za kulisami, aby zrobić tę pracę, prawda?

najpierw myślałem, że #(rem %1 %2) został ustawiony. Oni zostaną ogłoszone podobnie do zestawów i mogą być łatwo wykorzystane (przez kogoś, kto dopiero zaczyna z Xml):

(type #{1 2 3})   ; --> clojure.lang.PersistentHashSet
(type #(1 2 3))   ; --> user$eval12687$fn__12688

może ktoś podać mi stronę/ebook/wszystko, co wyjaśnia sztuczki Xml na przykład, "specjalna forma do funkcji anonimowej"? Większość zasobów jest po prostu dają najprostsze konstrukcje (podobne na wszystkie inne pochodne lisp), nie wdając się w subtelności w języku Xml. Znalazłem!--64--> który wygląda dość dobrze (a także wyjaśnia funkcje anonimowe, o których wspomniałem powyżej). wszelkie inne podobne zasoby?


to:

(reductions #(rem %1 %2) amount denominations)

jest równoważne temu:

(reductions rem amount denominations)

i jak zauważyłeś

(reductions function start collection) 

zwraca ciąg wyników pośrednich redukcji collectionfunction (Z start jako pierwszego argumentu pierwszego kroku redukcji). function musi przyjmować dwa parametry.

tak Więc, wynik:

(reductions function start [1 2 3 4 5]) 

a

((function start 1) (function (function start 1) 2) ...) 

#(rem %1 %2) składnia - to po prostu skrót do określenia anonymous funkcja, która przyjmuje dwa parametry (%1 a %2), nazywa rem na nich i zwraca wynik.

jest to równoważne:

(fn [a b] (rem a b))