Гибридный массив Lua и хэш-таблица;существует ли она где-нибудь еще?

StackOverflow https://stackoverflow.com/questions/2125654

Вопрос

Реализация таблиц в Lua содержит свои элементы в двух частях:часть массива и часть хэша.

Существует ли такая вещь в каких-либо других языках?

Взгляните на раздел 4 "Таблицы" в Реализация Lua 5.0.

Исходный код Lua 5.1 - table.c

Это было полезно?

Решение

Эта идея была оригинальной у Роберто Иерусалимского и остальной команды Lua.Я слышал, как Роберто выступал с докладом об этом на семинаре MIT по облегченным языкам в 2003 году, и в этом выступлении он обсуждал предыдущую работу и убедительно доказывал, что идея была новой.Я не знаю, скопировали ли его с тех пор другие языки.

Оригинальный Awk имеет несколько более ограниченную языковую модель, чем Lua;в качестве ключа в массиве можно использовать либо число, либо строку, но сами массивы не являются первоклассными значениями:массив должен иметь имя, и массив не может использоваться в качестве ключа в массиве.

Что касается реализации, я проверил исходные тексты для оригинального Awk, поддерживаемого Брайаном Керниганом, и реализация Awk использует хэш-таблицу, а не гибридную структуру массива / таблицы Lua.Различие важно, потому что в Lua, когда таблица используется с последовательными целочисленными ключами, накладные расходы на пространство такие же, как и для массива C.Это не верно для оригинального Awk.

Я не потрудился исследовать все более поздние реализации awk, например, Gnu Awk, mawk и так далее.

Другие советы

Редактировать: Это не отвечает на вопрос, который касался реализации.

АВК и сделал это.

Интересно, как в одних языках объединяются операции, которые отличаются в других:

  • Индексирование списка - a[10]
  • Ассоциативное индексирование - a['foo']
  • Доступ к объектному полю - a.foo
  • Вызовы функций / методов - a('foo') / a.foo()

Очень неполные примеры:

  • Perl - редкий язык, где последовательное / ассоциативное индексирование имеет отдельный синтаксис - a[10] / a{'foo'}.AFAIK, поля объекта сопоставляются с одной из других операций, в зависимости от того, какую хотел использовать разработчик класса.

  • В Python все 4 различны;последовательное / ассоциативное индексирование использует один и тот же синтаксис, но для них оптимизированы отдельные типы данных.

  • В Ruby поля объектов - это методы без аргументов - a.foo.

  • В JavaScript поля объектов a.foo являются синтаксическим сахаром для ассоциативной индексации a['foo'].

  • В Lua и AWK ассоциативные массивы также используются для последовательного индексирования - a[10].

  • В Дуга, последовательное и ассоциативное индексирование выглядит как вызовы функций - (a 10) / (a "foo"), и я думаю , a.foo есть ли синтаксический сахар и для этого (?).

Самое близкое, что я могу придумать, это Javascript - вы создаете массив с помощью new Array(), а затем переходите к индексации либо по номеру, либо по строковому значению.Вполне возможно, что по соображениям производительности некоторые реализации Javascript предпочитают делать это с использованием двух массивов по причинам, указанным в документации Lua, на которую вы ссылались.

ArrayWithHash Массив с хэшем это быстрая реализация гибрида массива и хэш-таблицы на C ++.

Поскольку C ++ является статически типизированным языком, в ArrayWithHash разрешены только целочисленные ключи (невозможно вставить строку или ключ указателя).Другими словами, это что-то вроде массива с резервной копией хэш-таблицы для больших индексов.Также он использует другую реализацию хэш-таблицы, которая менее эффективна с точки зрения памяти, чем реализация таблицы Lua.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top