Nie znalazłem standardowej funkcji biblioteki Elisp do scalania dwóch list właściwości, takich jak to:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Mógłbym coś zbudować dolist
, ale zanim to zrobię, chciałbym sprawdzić, czy nie przeoczam istniejącej funkcji w jakiejś bibliotece.
Aktualizacje na podstawie komentarzy :
- W odpowiedzi na komentarz „na wiele sposobów”:
Wyobrażam sobie, że nie ma takiej funkcji, ponieważ istnieją różne (i być może prawidłowe) odpowiedzi na pytanie: co zrobić, gdy masz zduplikowane nazwy właściwości o różnych wartościach?
Tak, istnieje pytanie, jak scalić duplikaty, ale istnieje stosunkowo niewiele sposobów rozwiązania tego problemu. Widzę dwa ogólne podejścia. Po pierwsze, kolejność argumentów może rozwiązać duplikaty; np. wygrane z prawej strony, jak w przypadku połączenia Clojure . Po drugie, scalanie może delegować na funkcję zwrotną podaną przez użytkownika, tak jak w przypadku scalania Ruby .
W każdym razie fakt, że istnieją różne sposoby wykonania tego zadania, nie przeszkadza wielu innym standardowym bibliotekom językowym w zapewnieniu funkcji scalania. Ten sam ogólny argument można powiedzieć o sortowaniu, a jednak Elisp zapewnia funkcjonalność sortowania.
- „Czy mógłbyś opracować?” / „Proszę dokładnie określić zachowanie, którego szukasz.”
Ogólnie rzecz biorąc, jestem otwarty na to, czego używa społeczność Elisp. Jeśli chcesz konkretny przykład, oto jeden przykład, który działałby:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
I wraca
'(k1 1 k2 2 k3 0))
Byłby to styl najbardziej zwycięski, jak połączenie Clojure.
- „To listy, więc po prostu dołącz?”
Nie, append
nie zachowuje semantyki listy właściwości . To:
(append '(k1 1 k2 2) '(k2 0))
Zwraca to:
(k1 1 k2 2 k2 0)
append to wbudowana funkcja w kodzie źródłowym `C '.
(dołącz i odpoczywaj SEKWENCJE)
Połącz wszystkie argumenty i ustaw wynik jako listę. Wynikiem jest lista, której elementy są elementami wszystkich argumentów. Każdy argument może być listą, wektorem lub łańcuchem. Ostatni argument nie jest kopiowany, tylko używany jako ogon nowej listy.
- „A twój przykład nie pokazuje scalenia - nie pokazuje nawet dwóch list właściwości”.
Tak; wykonuje scalanie krok po kroku. To pokazuje, jak wykonywanie scalania przy użyciu udokumentowanych funkcji listy właściwości Elisp jest boleśnie pełne:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Po prostu wyświetl wynikową wartość wyjściową z pl
:
(key-1 value-1 key-2 value-2)
Powtarzając, jestem w stanie napisać funkcję rozwiązującą ten problem, ale najpierw chciałem dowiedzieć się, czy taka funkcja istnieje gdzieś w powszechnym użyciu.
Na koniec, jeśli głosowałeś za pytaniem, ponieważ okazało się, że jest niejasne, poprosiłbym o ponowne rozważenie teraz, kiedy dołożyłem starań, aby wyjaśnić. To nie jest brak badań. Dokumentacja Elisp dotycząca „List” nie odpowiada na pytanie.
append
: (let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
co jest takie samo, (:a 3 :b 2 :a 1)
o ile używasz tylko funkcji plist, aby uzyskać dostęp do listy.
plist-get
nie plist-member
wydaje się, aby to obchodziło, czy istnieje wiele identycznych kluczy. Wygląda na to, że zachowują się analogicznie do alists pod tym względem (plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
. Tymczasem (plist-put '(:a "a" :b "b" :a "c") :a "d")
zastępuje wartość pierwszego :a
klucza, ale nie drugiego.
append
?