Angenommen, ich habe eine Liste von Zeichenfolgen L
, möglicherweise aus einem &rest
Argument. Was kann ich tun L
, um den gleichen Effekt wie das Folgende zu erzielen?
(concat (first L) (second L) ... (last L))
(Ich weiß, mapconcat
dass hier für dieses Beispiel funktionieren würde , aber ich suche nach einem allgemeinen Prozess.)
Was Sie tun wollten, scheint das Falten oder Entfalten einer Folge von Objekten des gleichen Typs zu sein. Es ist verlockend,
apply
für diesen Zweck zu verwenden, weil es in vielen Fällen tatsächlich funktionieren wird. Aber es ist nicht genau das richtige Werkzeug dafür, und hier ist der Grund:apply
ist ein Metaprogrammiermechanismus, nicht nur das, er ist auch zu allgemein für die Aufgabe, da er Sequenzen von Objekten unterschiedlichen Typs verarbeiten kann und nicht unbedingt Funktionen von zwei Argumenten aufruft. Infolgedessen wird manchmal ein falsches Verhalten angezeigt, zum Beispiel:Aber intuitiv würde man hier eine Typinkongruenz erwarten.
Es gibt keine Möglichkeit sicherzustellen
apply
, dass so viele Argumente verarbeitet werden können, wie Sie angeben können. Dies ist normalerweise eine durch die Sprachimplementierung auferlegte Grenze.Die von aufgerufene Funktion
apply
kann auf diese Weise eine Referenz der an sie übergebenen Argumentliste abrufen. Dies ist ebenfalls nicht offensichtlich und kann später zu Fehlern führen:Wenn die Argumentliste kopiert wird, zahlen Sie den Preis dafür, mehr Speicher als erforderlich zu verbrauchen. Wenn sie jedoch nicht kopiert wird (wie sie ist übergeben), besteht die Gefahr, dass die Liste beschädigt wird, wenn die aufgerufene Funktion sie ändert.
Der bessere Weg, dies zu tun, ist die Verwendung
cl-reduce
. Der Vorteil ist, dass es speziell für diese Art von Aufgaben entwickelt wurde.quelle