P: Jaki jest idiomatyczny sposób mapowania funkcji na liście właściwości?
Różne funkcje mapowania ( mapcar
i rodzina) mapują funkcję na sekwencji, takiej jak lista. W jaki sposób korzysta się z tych funkcji, gdy ma się do czynienia z listą właściwości , tj. Przy próbie mapowania każdej z właściwości zawartych na liście (którym byłby każdy inny element, zaczynając od pierwszego)? Wydaje mi się, że funkcja mapowania musiałaby uzyskać dostęp do listy w parach elementów, a nie jako pojedynczych elementów.
Jako zabawkowy przykład, w jaki sposób wziąć listę właściwości i zebrać wszystkie wartości właściwości? Gdyby to była lista skojarzeń, byłoby to dość proste:
(mapcar #'cadr '((:prop1 a) (:prop2 b) (:prop3 c))) ;=> (a b c)
Jestem pewien, że można to zrobić za pomocą pętli, ale wydaje się to trochę pracochłonne i zastanawiam się, czy istnieje bardziej idiomatyczny sposób na zrobienie tego.
mapcar
działa Twój przykład), czy też chcesz odwzorować pary symboli właściwości i wartości właściwości. To drugie jest bardziej ogólne (bardziej ogólnie przydatne), tak sądzę.Odpowiedzi:
Prawdopodobnie otrzymasz różne
loop
i iteracyjne odpowiedzi. AFAIK, nie ma idiomatycznego sposobu na zrobienie tego. Nawet nie sądzę, że bardzo często chce się kumulować tylko wartości właściwości (nie kojarząc ich z właściwościami).Oto jeden prosty sposób:
W bardziej ogólnym przypadku, gdy chcesz zmapować funkcję binarną na plist:
źródło
Prawdopodobnie zależy to od sytuacji. Ogólnie, gdybym musiał powiązać kilka wartości z wieloma nazwami, użyłbym tabeli skrótów, ale gdybym musiał użyć listy właściwości, użyłbym
cl-loop
. Poniżej kilka przykładów:A jeśli masz strukturę danych pokazaną w przykładzie:
źródło
Dla mnie odpowiedzią jest przekształcenie listy w alist, która jest równoważną strukturą danych, o połowę głębszą i łatwiejszą do manipulowania.
źródło
Z Emacsem z bieżącej GIT HEAD, który stanie się Emacs 25, możesz wykonać następujące czynności, tj. Łatwo zamienić plist w alist dzięki nowej
seq-partition
funkcji, a następnie przetworzyć wpisy alist przy użyciu standardowegomapcar
.Spójrz na
seq-partition
dokumenty za pomocąC-h f seq-partition RET
.źródło
Jednym z pomysłów jest wykorzystanie
-map-indexed
zdash
i zastosować transformację tylko nieparzystych wartości listy:Innym pomysłem jest po prostu przekonwertować plist do hash-table, korzystając
ht<-plist
zht
:Zauważ, że tablica skrótów nie zachowuje kolejności elementów.
źródło