Я не знайшов стандартної функції бібліотеки Elisp для об'єднання двох списків властивостей, наприклад цього:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Я міг би щось побудувати dolist
, але перш ніж зробити це, я хотів би перевірити, чи не переглядаю я існуючу функцію в якійсь бібліотеці.
Оновлення на основі коментарів :
- У відповідь на "багатосторонній" коментар:
Я б міг уявити, що такої функції не існує, оскільки на питання можливі різні (і, можливо, дійсні) відповіді: що робити, коли у вас є дублюючі імена властивостей з різними значеннями?
Так, виникає питання про те, як об’єднати дублікати, але існує досить мало способів вирішення цього питання. Я бачу два загальні підходи. По-перше, порядок аргументу може вирішити дублікати; наприклад, найправіша перемога, як у злитті Clojure . По-друге, злиття може делегувати функцію зворотного дзвінка, що надається користувачем, як у злитті Ruby .
У будь-якому випадку, те, що існують різні способи цього, не заважає багатьом іншим мовним стандартним бібліотекам надавати функцію злиття. Той самий загальний аргумент можна сказати про сортування, і все ж Elisp забезпечує функцію сортування.
- "Не могли б ви детальніше?" / "Будь ласка, вкажіть точно поведінку, яку ви шукаєте."
Взагалі кажучи, я відкритий до того, що використовує громада Elisp. Якщо ви хочете конкретного прикладу, ось один приклад, який би спрацював:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
І повертається
'(k1 1 k2 2 k3 0))
Це був би кращий стиль виграшів, як злиття Clojure.
- "Вони списки, тому просто додайте?"
Ні, append
не зберігає семантику списку властивостей . Це:
(append '(k1 1 k2 2) '(k2 0))
Повертає це:
(k1 1 k2 2 k2 0)
append - це вбудована функція у `C вихідному коді '.
(додавання та відпочинок СЕКВЕНЦІЇ)
Об'єднайте всі аргументи і складіть результат. Результатом є список, елементи якого є елементами всіх аргументів. Кожен аргумент може бути списком, вектором або рядком. Останній аргумент не копіюється, а використовується лише як хвіст нового списку.
- "І ваш приклад не показує нічого подібного до злиття - він навіть не показує два списки властивостей."
Так; вона робить злиття крок за кроком. Це показує, як злиття за допомогою документально підтверджених функцій списку властивостей Elisp є болісно багатослівним:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Просто виведіть отримане вихідне значення з pl
:
(key-1 value-1 key-2 value-2)
Повторюся, я здатний написати функцію, щоб вирішити цю проблему, але спершу я хотів з’ясувати, чи існує така функція десь загальноприйнятою.
Нарешті, якщо ви спростували це питання, тому що ви визнали його незрозумілим, я б просив вас переглядати зараз, коли я доклав певних зусиль для уточнення. Це не брак досліджень. Документація Elisp у "Списках" не відповідає на запитання.
append
: (let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
що таке саме (:a 3 :b 2 :a 1)
, доки ви використовуєте лише функції плісту для доступу до списку.
plist-get
ні plist-member
здається, байдуже, чи є кілька однакових клавіш. Схоже , що вони ведуть себе аналогічно alists в цьому відношенні: (plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
. Тим часом (plist-put '(:a "a" :b "b" :a "c") :a "d")
замінює значення першого :a
ключа, а не другого.
append
?