Frage

Lua-Implementierung von Tabellen halten ihre Elemente in zwei Teilen: ein Array-Teil und einen Hash-Teil

.

Gibt es so etwas gibt es in allen anderen Sprachen?

Werfen Sie einen Blick auf Abschnitt 4, Tabellen, in Die Implementierung von Lua 5.0 .

Lua 5.1 Quellcode - table.c

War es hilfreich?

Lösung

Diese Idee war ursprünglich mit Roberto Ierusalimschy und dem Rest des Lua-Teams. Ich hörte Roberto einen Vortrag über sie am MIT Leichtbau Sprachen Workshop gibt im Jahr 2003 und in diesem Vortrag diskutierte er vor der Arbeit und überzeugend argumentiert, dass die Idee war neu. Ich weiß nicht, ob andere Sprachen kopiert haben es da.

Die ursprüngliche Awk hat ein etwas eingeschränktes Sprachmodell als Lua; entweder eine Zahl oder eine Zeichenfolge als Schlüssel in einem Array verwendet werden, aber Arrays selbst sind nicht erstklassige Werte. ein Array muss einen Namen hat, und ein Array kann nicht als Schlüssel im Array verwendet wird

Im Hinblick auf die Umsetzung, ich habe die Quellen für die ursprüngliche Awk geprüft, wie von Brian Kernighan gehalten und die Implementierung von awk verwendet eine Hash-Tabelle, nicht Lua Hybrid-Array / Tabellenstruktur. Die Unterscheidung ist wichtig, weil in Lua, wenn eine Tabelle mit aufeinanderfolgenden ganzen Schlüsseln verwendet wird, die Raum-Overhead die gleichen wie für einen C-Array ist. Dies ist nicht gilt für Original Awk.

Ich habe nicht die Mühe gemacht, alle späteren Implementierungen von awk zu untersuchen, zum Beispiel Gnu awk, mawk, und so weiter.

Andere Tipps

EDIT:. Das ist nicht die Frage beantworten, die über die Umsetzung war

AWK auch es getan hat.

Es ist interesing, wie einige Sprachen Operationen conflate, die in anderen unterschiedlich sind:

  • Liste Indizierung - a[10]
  • Assoziative Indizierung - a['foo']
  • Objektfeld Zugang - a.foo
  • Funktion / Methode ruft - a('foo') / a.foo()

Sehr unvollständig Beispiele:

  • Perl ist die seltene Sprache in der sequenziellen / assoziative Indexierungs getrennte Syntax - a[10] / a{'foo'}. AFAIK, Objektfelder Karte zu einer der anderen Operationen, je nachdem, welche die Implementierer der Klasse fühlte sich wie mit.

  • In Python, alle 4 sind verschieden; sequentielle / assoziative Indizierung Verwendung derselben Syntax aber separate Datentypen für sich optimiert werden.

  • In Ruby Objektfelder sind Methoden ohne Argumente - a.foo

  • .
  • In JavaScript Objektfelder a.foo Syntax Zucker sind für assoziative Indizierung a['foo'].

  • In Lua und AWK sind assoziative Arrays auch für sequentielle Indizierung verwendet -. a[10]

  • In Arc , sequentielle und assoziative Indizierung sieht aus wie Funktionsaufrufe - (a 10) / (a "foo"), und ich denke, a.foo ist Syntax Zucker für diese auch (?).

Das nächste, was ich denken kann, ist Javascript - Sie erstellen ein Array mit new Array(), und dann zu indizieren gehen entweder nach Anzahl oder String-Wert. Es könnte auch aus Performance-Gründen werden einige Javascript-Implementierungen wählen so mit zwei Arrays zu tun, für die genannten Gründe in der Lua Dokumentation, die Sie verknüpft.

ArrayWithHash ist eine schnelle Umsetzung der Array-Hashtable hybrid in C ++.

Da C ++ ist eine statisch typisierten Sprache, nur ganzzahlige Tasten erlaubt sind in ArrayWithHash (keine Möglichkeit zum Einsatz String oder Zeigertaste). Mit anderen Worten, es ist so etwas wie ein Array mit Hash-Tabelle Backup für großen Indizes. Auch verwendet er verschiedene Hash-Tabelle Implementierung, die weniger speichereffizienter als Lua-Tabelle Implementierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top