Q: quelle est la manière idiomatique de mapper une fonction sur une liste de propriétés?
Les diverses fonctions de mappage ( mapcar
et famille) mappent une fonction sur une séquence telle qu'une liste. Comment utilise-t-on ces fonctions lorsqu'il s'agit d'une liste de propriétés , c'est-à-dire lorsque l'on essaie de mapper sur chacune des propriétés contenues dans la liste (qui serait tout autre élément à partir du premier)? Il me semble que la fonction de mappage aurait besoin d'accéder à la liste par paires d'éléments plutôt qu'en tant qu'éléments individuels.
À titre d'exemple de jouet, comment prendre une liste de propriétés et collecter toutes les valeurs des propriétés? S'il s'agissait plutôt d'une liste d'associations, ce serait assez simple:
(mapcar #'cadr '((:prop1 a) (:prop2 b) (:prop3 c))) ;=> (a b c)
Je suis sûr que cela pourrait être fait avec une boucle, mais cela semble un peu laborieux et je me demande s'il y a une façon plus idiomatique de le faire.
mapcar
exemple d'alist) ou si vous souhaitez mapper les paires de symbole de propriété et de valeur de propriété. Ce dernier est plus général (plus généralement utile), je suppose.Réponses:
Vous obtiendrez probablement des
loop
réponses diverses et itératives. AFAIK, il n'y a aucun moyen idiomatique de le faire. Je ne pense même pas qu'il soit très courant de vouloir accumuler uniquement les valeurs des propriétés (sans les associer aux propriétés).Voici une façon simple de le faire:
Pour le cas plus général, où vous souhaitez mapper une fonction binaire sur un plist:
la source
Cela dépendrait probablement d'une situation. En général, si j'ai besoin de lier un certain nombre de valeurs à un certain nombre de noms, j'utiliserais une table de hachage, mais si je dois utiliser une liste de propriétés, j'utiliserais
cl-loop
. Voici quelques exemples:Et si vous avez une structure de données que vous montrez dans votre exemple:
la source
Pour moi, la réponse est de transformer le plist en une liste, qui est une structure de données équivalente, juste deux fois moins profonde et plus facile à manipuler.
la source
Avec Emacs de l'actuel Git HEAD qui deviendra Emacs 25, vous pouvez effectuer les opérations suivantes, c'est-à-dire transformer le plist en liste facilement avec la nouvelle
seq-partition
fonction, puis traiter les entrées de liste en utilisant standardmapcar
.Jetez un œil aux
seq-partition
documents à l'aideC-h f seq-partition RET
.la source
Une idée est d'utiliser
-map-indexed
dedash
et appliquer la transformation que des valeurs impaires de la liste:Une autre idée est de simplement convertir un plist en une table de hachage, en utilisant
ht<-plist
deht
:Notez que la table de hachage ne préserve pas l'ordre des éléments.
la source