La seule chose que j'ai trouvée qui fonctionne est
(eval `(vector ,@(mapcar #'1+ [1 2 3 4])))
=> [2 3 4 5]
mais cela semble beaucoup trop compliqué pour être la «bonne» façon.
Utilisez cl-map
plutôt:
(cl-map 'vector #'1+ [1 2 3 4])
Un petit arrière-plan supplémentaire: cl-map
est la fonction Common Lispmap
qui se généralise aux types de séquence:
(cl-map 'vector #'1+ '[1 2 3 4]) ;; ==> [2 3 4 5]
(cl-map 'list #'1+ '(1 2 3 4)) ;; ==> (2 3 4 5)
(cl-map 'string #'upcase "abc") ;; ==> "ABC"
Il peut également convertir entre les types de séquence (par exemple, ici, l'entrée est une liste et la sortie est un vecteur):
(cl-map 'vector #'1+ '(1 2 3 4)) ;; ==> [2 3 4 5]
cl
bibliothèques ne donnent-elles pas d'avertissements au compilateur, cependant? (Surtout parce que la FSF est odieuse?)cl
bibliothèque plutôt qu'à lacl-lib
bibliothèque relancée . Je ne suis pas, par exemple, obtenir des avertissements quand je(defun fnx () (cl-map 'vector #'1+ '[1 2 3 4]))
puis(byte-compile 'fnx)
.Depuis que j'ai été battu de 18 secondes, voici un moyen plus simple et plus sûr de le faire sans la bibliothèque cl. Il n'évalue pas non plus les éléments.
la source
cl-lib
dépendance.apply
.(apply #'vector ...)
pourrait être un peu plus rapide, mais pour être complet, il peut également être remplacé par(vconcat ...)
.La variante inplace pas si élégante pour le cas où le vecteur d'origine n'est plus nécessaire par la suite et l'allocation de mémoire est critique en temps (par exemple, le vecteur est grand).
Le résultat est stocké dans
x
. Si vous avez besoin du formulaire pour retournerx
à la fin, vous pouvez ajouterfinally return x
comme suit:la source
Pour être complet, utilisez
seq
:la source
seq-into
ligne. L'utilisateur a supprimé sa réponse pour la raison suivante: "Ma solution est moins pertinente car la bibliothèque seq utilise les extensions Common Lisp sous-jacentes. - Fólkvangr 16 mai à 8:53"Vous pouvez utiliser la boucle
Parfois, vous ne voulez pas modifier le vecteur d'origine, vous pouvez en faire une copie
ou créez un nouveau vecteur à partir de zéro
la source