Pregunta

aplicación de las tablas de Lua mantener sus elementos en dos partes: una parte de matriz y una parte de hash

.

¿Tiene tal cosa existe en ningún otro idioma?

Tome un vistazo a la sección 4, Tablas, en la implementación de Lua 5.0 .

Lua 5.1 Código Fuente - table.c

¿Fue útil?

Solución

Esta idea era original con Roberto Ierusalimschy y el resto del equipo de Lua. Roberto oí dar una charla al respecto en el taller del MIT ligeros Idiomas en 2003, y en esta charla se discutió el trabajo previo y argumentado de manera convincente que la idea era nueva. No sé si otros idiomas han copiado desde entonces.

El Awk original tiene un modelo de lenguaje algo más restringido que Lua; un número o una cadena se puede utilizar como una llave en una matriz, pero sí las matrices son valores no de primera clase:. una matriz debe tener un nombre y una matriz no puede ser utilizado como una clave en la matriz

En cuanto a la aplicación, he comprobado las fuentes para el Awk original como mantenida por Brian Kernighan, y la implementación de awk utiliza una tabla hash, no híbrido de estructura de matriz / tabla de Lua. La distinción es importante porque en Lua, cuando se utiliza una tabla con las teclas de números enteros consecutivos, el espacio superior es el mismo que para una matriz C. Este es no cierto para Awk originales.

No he tomado la molestia de investigar todas las implementaciones posteriores de awk, por ejemplo, GNU Awk, mawk, y así sucesivamente.

Otros consejos

EDIT:. Esto no responde a la pregunta, que estaba a punto de la aplicación

AWK también lo hizo.

Se interesing cómo algunos idiomas confunden las operaciones que son diferentes en otros:

  • Lista de indexación - a[10]
  • indexación asociativa - a['foo']
  • campo Objeto de acceso - a.foo
  • Función / Método llama - a('foo') / a.foo()

Ejemplos muy incompletas:

  • Perl es el lenguaje raros donde la indexación secuencial / asociativo tiene la sintaxis separada - a[10] / a{'foo'}. Que yo sepa, los campos objeto de mapa a una de las otras operaciones, dependiendo de lo que el implementador de la clase sentía como usar.

  • En Python, todos 4 son distintos; secuencial / asociativo uso de indexación misma sintaxis, pero los tipos de datos separados están optimizados para ellos.

  • En Ruby, campos de objeto son métodos sin argumentos - a.foo

  • .
  • En JavaScript, campos de objeto a.foo son el azúcar sintaxis para a['foo'] indexación asociativa.

  • En Lua y AWK, matrices asociativas también se utilizan para la indexación secuencial -. a[10]

  • Arco , secuenciales y asociativas miradas de indexación, como las llamadas de función - (a 10) / (a "foo"), y creo a.foo es el azúcar de la sintaxis para esto también (?).

Lo más parecido que se me ocurre es Javascript - se crea una matriz con new Array(), y luego proceder al índice ya sea por número o por valor de cadena. Bien podría ser por razones de rendimiento algunas implementaciones de Javascript optan por hacerlo a través de dos matrices, por las razones señaladas en la documentación que Lua vinculados a.

ArrayWithHash es una implementación rápida de híbrido matriz de tabla hash en C ++.

Como C ++ es un lenguaje de tipos estáticos, sólo números enteros teclas están permitidos en ArrayWithHash (no hay manera de cadena de inserción o la clave del puntero). En otras palabras, es algo así como una matriz con copia de seguridad tabla hash para los índices de gran tamaño. También se utiliza diferente aplicación tabla hash que es menos eficiente que la memoria-Lua aplicación mesa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top