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

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

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

Смотрите на раздел 4, Таблицы, в Реализации Lua 5.0.

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

10
задан Yu Hao 27 July 2016 в 05:14
поделиться

3 ответа

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

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

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

Я не удосужился расследовать все более поздние реализации AWK, E.g. GNU awk, Mawk и так далее.

9
ответ дан 3 December 2019 в 22:37
поделиться

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

2
ответ дан 3 December 2019 в 22:37
поделиться

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

AWK также сделал это.

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

  • Индексирование списков - 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].

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

4
ответ дан 3 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: