Schema: ändern Sie den Wert eines Elements in einer Liste
Ich hasse es über SO einen Weg zu finden, einfache Funktionen, aber ich kann wirklich nicht finden, eine Funktion wie das überall:
Gegeben eine Liste (1 2 3 4 5), ich möchte das äquivalent (PHP, Perl, Python)
$a = array(1, 2, 3, 4, 5);
$a[3] = 100;
Die Ergebnisse in (1 2 3 100 5)
Dank!
- Haben Sie sich überlegt, dass, wenn das ist die Art von Funktionalität, die Sie wollen aus der Struktur der Daten, zufällige re-Zuordnung der Zellen, dann vielleicht Sie wollen nicht wirklich eine Liste, aber stattdessen vielleicht einen vector?
InformationsquelleAutor amindfv | 2011-09-11
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schreiben Sie
list-set!
von Guile, etwa so:(Versucht, diese in DrRacket.)
list-set!
imguile
. Diese lassen Sie mich-Anschluss das Skriptchicken
.Verwendung von standard-Funktionen, ohne SRFI:
Guile hat eine eingebaute Funktion namens
list-set!
, das genau das tut, was Sie wollen, mit null-basierten Indizes. Für Ihr Beispiel, würden Sie haben:Ich glaube nicht dass das standard-Schema, aber, und ich weiß nicht, ob es wirklich effizient ist. Für ein fixed-length array, sollten Sie wahrscheinlich verwenden einen Vektor:
Ich bin mir ziemlich sicher, dies ist Teil der standard-Sprache.
set!
im Schema nicht unterstützt, stellen. Aber mit SRFI 17 geladen (wenn Ihre Umsetzung unterstützt---Guile tut), können Sie(set! (list-ref lst 3) 100)
wenn Sie wollen. EDIT: Hoppla, das funktioniert nicht in Arglist, aber(set! (caddr lst) 100)
tut.setf
funktioniert, ist auf der makro-Ebene, aber es funktioniert nicht auf einige "zurück-Verweis". Dasselbe gilt für die srfi-17-Schema: es wird kein "zurück-Verweis", stattdessen verwendet es dieset!
-ed-Funktion zu finden, eine setter-Funktion.list-ref
aber nicht in meinem edit, weil genau das, was Sie sagte.Ich bin vielleicht ein bisschen spät, aber ich habe eine andere Antwort.
Teil der funktional-Programm Paradigma zu sein scheint, versuchen zu vermeiden, ändern von Daten, wenn möglich. Aus Gründen der Effizienz sollten Sie mit den anderen Antworten hier. Aber ansonsten, sollten Sie eine nicht-verändernde Funktion wie diese:
Übergibt die folgenden tests:
(Der code ist geschrieben in Hühner-System und die tests mit dem "missbehave" - Bibliothek. Aber wie es scheint, ziemlich tragbar-Schema.)