Common Lisp scheint zu große Längen zu gehen, um sowohl zerstörungsfreie Funktionen (wie subst & entfernen) und destruktive Funktionen und ändern Makros (wie löschen & rotatef) für den allgemeinen Gebrauch. Vermutlich dient dies dazu, sowohl funktionale als auch nichtfunktionale Programmierstile effektiv zu unterstützen. Aber es scheint auch eine besondere Voreingenommenheit gegenüber dem nichtfunktionalen Stil beim Design des allgegenwärtigen Modells zu geben. Das setf
Makro, das verallgemeinerte Referenz enthält, ist anscheinend flexibel genug, um jeden spezifizierbaren Ort zu verändern (außer vielleicht für unveränderliche ganze Zahlen und Zeichen). Diese Macht erklärt wahrscheinlich ihre weit verbreitete Verwendung trotz ihres nichtfunktionellen/destruktiven Verhaltens.Zerstörungsfreie Setf?
Die Frage ist, warum gibt es keinen entsprechenden „funktional“ nicht zerstörenden Operator, gemustert nach setf
(nennen wir es gesetzt, da set
bereits belegt ist), die analog zu anderen nicht zerstörenden/zerstörende Lisp Operator-Paare. Solch ein Operator würde wahrscheinlich die gleichen Argumente nehmen, einen Ort und einen Wert, würde aber eine Kopie des Objekts, in das der Ort eingebettet wurde, anstelle des neuen Werts an diesem Ort zurückgeben. Es würde wahrscheinlich auch einen universellen Kopierer von irgendeiner Art mit dem Standard setf
einschließen, der die Kopie einfach modifiziert, bevor er sie zurückbringt. Der nicht zerstörende Operator könnte dann anstelle von setf
für die meisten Zuweisungen verwendet werden, wobei setf
für wirklich große Objekte reserviert ist. Ist ein solcher Operator angesichts der (vorausgesetzten) Anforderung an einen universellen Kopierer und der Notwendigkeit, ein Objekt von einem darin eingebetteten beliebigen Ort wiederherzustellen, möglich (oder sogar möglich)?
Nehmen wir an, Sie beschränken das Kopieren auf grundlegende Lisp-Objekte (abgesehen von CLOS-Instanzen), ist das Wesen der universellen Kopieridee, dann rekursive generische Methoden für jeden Typ von Basisobjekt zu schreiben? – davypough
@davypough Ja, die standardmäßige universelle Kopie könnte eine Kopie aller Komponenten einer Datenstruktur erstellen (nur eine Kopierstufe, die oben gezeigte Aktualisierungsfunktion führt die rekursive Kopie bei Bedarf durch). Beachten Sie, dass dies ein Problem mit Zirkelreferenzen sein wird. – coredump