Problem 9: Intro to Maps
Zadanie polega na odgadnięciu wyniku podania mapie klucza jako parametr i kluczowi mapy.
T1: (= __ ((hash-map :a 10, :b 20, :c 30) :b))T2: (= __ (:b {:a 10, :b 20, :c 30}))E1: 20E2: ({1 20} 1)E3: (:k {:k 20}) |
Problem 10: Maps: conj
T1: (= {:a 1, :b 2, :c 3} (conj {:a 1} __ [:c 3]))E1: {:b 2}E2: [:b 2]E3: (hash-map :b 2) |
Problem 11: Intro to Sequences
Zadanie polega na odgadnięciu wyniku działania poszczególnych funkcji testowych. Funkcja first zwraca pierwszy element ciągu, second drugi, last ostatni.
T1: (= __ (first '(3 2 1)))T2: (= __ (second [2 3 4]))T3: (= __ (last (list 1 2 3)))E1: 3E2: (first '(3))E3: (last '(3))E4: (second (first (list '(1 3) 2))) |
Problem 12: Sequences: rest
T1: (= __ (rest [10 20 30 40]))E1: [20 30 40]E2: '(20 30 40) |
Problem 13: Intro to functions
1. Za pomocą funkcji fn. Dzięki niej tworzymy funkcje anonimowe. Nazwa za fn to nazwa funkcji. Nie daje ona nic oprócz tego, że łatwiej rozpoznać miejsce błędu w przypadku gdy program się posypie.
2. Inny sposób tworzenia funkcji anonimowych: za pomocą znaku number. np.: #(+ % 1). % - jest parametrem przekazanym do funkcji. Jeżeli do tej funkcji przekazywane jest więcej niż jeden argument, to można użyć znaku % z numerem. np. : %1 , %2 itd..
3. Funcja partial służy do uzupełniania parametrów funkcji, która jest jej pierwszym argumentem. W ten sposób można sobie skrócić kod, gdy wartość jednego z argumentów funkcji jest znana. W tym: T4 wypadku przekazywany jest dodatkowy argument do funkcji '+'.
Aby zapisać funkcję pod daną nazwą można użyć makra def do którego przekazujemy nazwę i funkcję anonimową, lub uproszczonego defn.
Tym razem trzeba zgadnąć wynik jaki ma pojawić się po przekazaniu parametru do funkcji anonimowej.
T1: (= __ ((fn add-five [x] (+ x 5)) 3))T2: (= __ ((fn [x] (+ x 5)) 3))T3: (= __ (#(+ % 5) 3))T4: (= __ ((partial + 5) 3))E1: 8 |
Problem 14: Hello World
Zadanie polega na utworzeniu funkcji anonimowej, która weźmie za parametr podany ciąg znaków i doda do niego Hello z !. Jako, że z poprzedniego zadania wiemy już jak tworzyć funkcje anonimowe zadanie jest trywialne. ;) .
T1: (= (__ "Dave") "Hello, Dave!")T2: (= (__ "Jenn") "Hello, Jenn!")T3: (= (__ "Rhea") "Hello, Rhea!")E1: #(str "Hello, " % "!")E2: (fn [arg] (str "Hello," arg "!"))E3: (fn hello-hi [arg] (str "Hello," arg "!"))E4: #((partial str "Hello, ") % "!") |
Problem 15: Double Down
T1: (= (__ 2) 4)T2: (= (__ 3) 6)T3: (= (__ 11) 22)T4: (= (__ 7) 14)E1: #(* % 2)E2: (fn [d] (* d 2)) |
Problem 16: Sequences: map
(map + [1 2 3]) daje: [1 2 3], bo (+ 1) daje 1
(map + [1 2 3] [4 5 6]) daje : [5 7 9], bo (+ 1 4) to 5, (+ 2 5) to 7...
Działanie jest wykonywane kolumnami. Jako, że funkcja + może wziąć dowolną liczbę parametrów można do map dawać dowolną ilość kolekcji. Jeżeli kolekcje mają różne długości. Map wykona działanie na ilości elementów równej długości najkrótszej kolekcji.
Może narysuję o co chodzi:
(map + '(1 2 3) '(4 5 6) '(1 1 1)) to: 1 | 2 | 3 4 | 5 | 6 1 | 1 | 1 + --------- 6 | 8 |10Wynik: '(6 8 10)(map + '(1 2) '(4 5 6) '(1 1 1)) to: 1 | 2 4 | 5 1 | 1 + ----- 6 | 8 Wynik: '(6 8) - 2 elementy, bo najkrótsza lista miała długość 2(map #(+ % 5) '(1 2 3) '(4)) to:ArityException Wrong number of args (2) passed to: core$eval1442$fn clojure.lang.AFn.throwArity (AFn.java:437)Dlaczego błąd? Bo w przeciwieństwie do funkcji + funkcja anonimowa #(+ % 5) przyjmuje tylko jeden parametr, a wiemy, że map przekazujeparametry kolumnami. W tym przypadku map wysłał do funkcji 1 i 4
Aby wyrażenie było prawidłowe należy uwzględnić drugi parametr w funkcji anonimowej: #(+ %1 %2 5)(map #(+ %1 %2 5) '(1 2 3) '(4)) to: (10), bo 1 + 4 + 5 = 10 - reguła o obcinaniu list wciąż obowiązuje. |
T1: (= __ (map #(+ % 5) '(1 2 3)))E1: '(6 7 8)E2: [6 7 8] |

Brak komentarzy:
Prześlij komentarz