Angenommen, ich habe eine Assoc-Liste wie diese:
(setq x '((foo . ((bar . "llama")
(baz . "monkey")))))
Und ich möchte den Wert bei bar
. Ich kann dies tun:
(assoc-default 'bar (assoc-default 'foo x))
Aber was ich wirklich möchte, ist etwas, das mehrere Schlüssel akzeptiert, wie z
(assoc-multi-key 'foo 'bar x)
Existiert so etwas vielleicht in einem Paket irgendwo? Ich bin mir sicher, dass ich es schreiben könnte, aber ich habe das Gefühl, dass mein Google-Fu einfach ausfällt und ich es nicht finden kann.
elisp
association-lists
Abingham
quelle
quelle
assoc-multi-key
. Vermutlich sucht es nach Übereinstimmungen mit den beiden ersten Argumenten, aber das ist wirklich alles, was man von dem, was Sie gesagt haben, annehmen könnte. Und es kann eindeutig nicht mehr als zwei Schlüssel akzeptieren, da das alistische Argument (vermutlichx
) das letzte und nicht das erste ist - was darauf hindeutet, dass es im Allgemeinen nicht allzu nützlich ist. Versuchen Sie tatsächlich anzugeben, wonach Sie suchen.setq
Formulars im Beispiel verwirrend, also habe ich es bearbeitet, um die allgemeine Punktnotation für Assoc-Listen zu verwenden.assoc-multi-key
bleibt unbestimmt.assoc-multi-key
geht darum, den ersten Schlüssel in der Assoc-Liste nachzuschlagen. Dies sollte sich in eine neue Assoc-Liste auflösen, in der wir den nächsten Schlüssel nachschlagen. Und so weiter. Grundsätzlich eine Abkürzung zum Ausgraben von Werten aus verschachtelten Assoc-Listen.let-alist
? zB(let-alist '((foo . ((bar . "llama") (baz . "monkey")))) .foo.bar)
wird zurückkehren"llama"
. Ich denke, Sie haben geschrieben,let-alist
nachdem die Frage gestellt wurde, aber es ist im Geiste der Frage und sehr erwähnenswert, IMO!Antworten:
Hier ist eine Option, die genau die Syntax verwendet, nach der Sie gefragt haben, aber verallgemeinert und recht einfach zu verstehen ist. Der einzige Unterschied besteht darin, dass der
ALIST
Parameter an erster Stelle stehen muss (Sie können ihn an die letzte Stelle anpassen, wenn dies für Sie wichtig ist).Dann können Sie es nennen mit:
quelle
Hier ist eine allgemeinere Lösung:
Es kann einen beliebigen "Pfad" von Schlüsseln nehmen. Dies wird zurückkehren
(bar . "llama")
während dies zurückkehren wird
(baz . "monkey")
:quelle
Hier ist eine einfache Funktion, die mit einem Alist funktioniert, der in einem anderen Alist verschachtelt ist:
quelle