2011-02-07 30 views
21

Napisałem małą anonimową funkcję do użycia z połączeniem map. Funkcja zwraca wektor zawierający nazwę kolumny i wartość kolumny z kwerendy zestawu wyników SQL.Clojure: zwracanie wektora z anonimowej funkcji

Oto funkcja (wejście jest nazwą kolumny):

(fn [name] [(keyword name) (.getObject resultset name)]) 

Działa to dobrze, ale kiedy próbowałem użyć „uproszczoną” wersję funkcji anonimowej, mam błąd:

#([(keyword %) (.getObject resultset %)]) 

java.lang.IllegalArgumentException: Wrong number of args (0) passed to: PersistentVector 

Oto map wezwanie:

(into {} (map (fn [name] [(keyword name) (.getObject resultset name)]) column-names)) 

Czy jest możliwe aby użyć Simpl czy składnię tej funkcji? Jeśli tak to jak?

Dzięki.

+0

Niektórzy więcej informacji: http://groups.google.com/group/clojure/browse_thread/thread/9037f31748cef0e2/62d3f3a45a139157?lnk=gst&q= Nick + Zbinden # 62d3f3a45a139157 – nickik

Odpowiedz

24

Twoim problemem jest to, że prosta składnia próbuje ocenić wektor jako wywołanie funkcji.

Można wstawić funkcję „identyczność”, aby to działało, jak jest to tylko prosta funkcja, która zwraca wektor bez zmian:

#(identity [(keyword %) (.getObject resultset %)]) 
+0

Wybrałem tę odpowiedź, ponieważ wyjaśnia ona również, dlaczego problem występuje, chociaż odpowiedź Alex Ott również działa (i stanowi ogólne rozwiązanie dla innych struktur danych). Dziękuje wszystkim. – Ralph

+0

Edytowałem tę odpowiedź, aby uwzględnić sugestię Alexa, ale wygląda na to, że z jakiegoś powodu została zignorowana. No cóż. – apg

+0

Dodałem przykład bardziej idealnego rozwiązania, a nie tylko pokazano kod, który pokazuje, dlaczego nie działał. Ponieważ edycja nie została podjęta. – Psyllo

23

Trzeba użyć Vector, funkcję, aby to zrobić:

#(vector (keyword %) (.getObject resultset %)) 

PS są też funkcje map, zestawów itp.

4

Tak, Clojure powinien naprawdę wspierać konstrukcję # [...], tylko dla tego przypadku.

Polecam następujące jako najlepszej alternatywy:

#(vector (keyword %) (.getObject resultset %)) 
+2

Nie sądzę, że # [...] będzie na tyle pospolity, aby zagwarantować specjalną składnię, a kiedy się o tym dowiesz, wrzucenie "wektora" w nie ma nic wielkiego. – apg

+0

Myślałem o tym samym konstrukcie # [...] '. Jak mogę napisać dla niego makro? # oznacza makro czytnika? –

+0

Możesz napisać '# (-> [(keyword%) (.getObject zestaw wyników%)])', ale uważam to za niejasne –