что тут написали - на самом деле действительно дело с массивами в луа обстоит так-себе. Заявления о том, что там всё внутри как настоящий массив сложно проверить т.к. луа не умеет печатать свои массивы - это просто указатель на table, а что там внутри - хз. Можно к примеру выше добавить a[2] = nil и все принтилки, что я нашёл в интернете скажут, что у этого массива нет второго элемента т.е. там то, что Макс назвал дыркой (свечку над памятью VM не держал, но дело мутное) . А как массив будет реагировать на добавление новых элементов - видимо же расширяться? Значит это уже не просто массив, а типа слайс или аррейлист. Что ещё там скрыто интересного? table ведь может быть расширен, операторы перегружены т.е. по обращению по скобочкам может вызываться наша ф-я - а значит это уже не просто взятие элемента из памяти - это диспетчеризация, это вызов ф-и, короче... если там есть массив - то где-то очень глубоко.
Касаемо же самого концепта - дать абсолютно минимальный набор структур данных - вот тут уже точно скажу, что это бред. Структуры данных не просто так идут всегда вместе в книжках с алгоритмами т.к это суть одно и то-же - оптимальный способ оперирования данными, через структуру ли, или через действия над ними. Так вот, банить какую-то структуру данных - это то же, что банить алгоритмы - хз, что тут можно найти хорошего, это просто жёсткое ограничение выразительности и производительности. Знаю только одно разумное такое ограничение - иммутабильность, но и тут всё неоднозначно, и не просто так большинство языков до сих пор мутабельны. Если же речь только про простоту для программиста, мол в голове будет хорошо укладываться, можно будет сложные системы строить и не ошибаться - то это заблуждение. В Scheme тоже всё сведено до одних списков - много сложных систем на scheme видели? К тому-же на практике там всегда есть массивы - их добавляют те, кто делает реализацию, хоть их и нет в описании языка т.к. п*деть, как говорится - не мешки ворочать, и придумать язык с интересной идеей это совсем не то же самое, что потом на нём писать. Из таких "простых" языков, за счёт ограничения кол-ва используемых средств отмечу ещё брейнфак - так то проще уже некуда, но что-то проще от этого не стало. А дело всё вот в чём - есть такое понятие, как инварианты - ты видишь структуру данных и понимаешь, что в ней удовлетворяются какие-то обязательные условия, в ней не может что-угодно быть. И эти инварианты какраз делают систему проще, а когда массив - он же мапка, он же объект хз какого класса - проще от этого может быть только создателю языка (какая элегантная идея! и всего одно правило надо прописать в компиляторе!), но не пользователю языка.
В Си++ "пришли с противоположного конца" - решили всё разнообразие структур данных (точнее - контейнерных) свести к одному (или похожему) интерфейсу и локационным типам, чтобы работать из одних и тех же "алгоритмов". В результате - опять "зоопарк" получился. Только теперь - из "описаний нюансов", оговорок, частных случаев и "особенностей"... "Нет счастия в жизни!"
Обсуждают сегодня