Смотря с чем сравнивать и какой код сравнивать. Шаблоны и прочее метапрограмирование нигде не читается хорошо. Линейный код в виде цепочек обычно чище, будь то Java или плюсы или как тут - в Rust.
tldr: дублируют файлы, чтобы при чтении ассетов не крутить лишний раз шпинделя ваших HDD. якобы они делают так, чтобы текстуры к пропам при чтении оказывались на диске рядом. То есть скорее всего запекают текстуру в модель, даже если другая модель использует ту же текстуру. Звучит как сомнительная оптимизация.
Я так понимаю почти у каждого продукта есть по справочнику, но у всех разные версии и даты публикации. Офис на Альте и Офис Плюс ссылаются на 2022, для дома и домашняя версия - на новый, для образования - третий вариант, хотя по составу не уверен, что есть разница с домашними кроме как в версии чего-то на титульнике - 3.5E (видимо Educational) vs 3.5H (Home)
И как «Справочник макрокоманд на языке программирования Lua» оно присутствует только в "МойОфис для дома", который ещё надо не перепутать с "МойОфис Стандартный. Домашняя версия", у которого этот же мануал назван просто "Справочник макрокоманд" и ни одно из страниц документаций с этими руководствами не ищется через поиск на сайте адекватным образом - не уверен что даже среди 1347 результатов найдётся тот самый.
gcc 4.9 это я конечно от балды сказал, подсмотрев какие версии compiler explorer поддерживает. Речь скорее за ситуацию, когда зависимости требуют одновременно и несколько древние (но присутствовавшие и ещё не выпиленные) и свежие зависимости и все, которых могло и не существовать на момент существования прошлых зависимостей. Собственно обратная ситуация тоже возможна - например debian по-умолчанию использует gcc 12 и clang 14, а мы например хотим собирать код С++20 компиляторами с их стабильной поддержкой - то бишь gcc не старше 14 и clang не ранее 19. trunk версии там ещё выше, естественнно.
nixpkgs-legacy
это какое-то наше произвольное имя, которое мы задаём, так?
nix develop
вот этот момент кстати тоже несколько непонятен. Мне казалось, что мы где-то явно указываем, что входит в окружение develop и что помимо develop есть ещё другие варианты, но в примере вашего скрипта develop нигде явно не упоминался.
Так, а если скажем хочется какой-нибудь gcc 4.9.X, но при этом в составе иметь какой-нибудь пакет под rust 1.92, то как все это стыкуется? Каждый срез nixpkgs содержит весь срез прошлых версий?
Прикольно, теперь у меня есть две ссылки на немного разные документы.
Всё же было бы неплохо иметь некоторый онлайн гайд, что-нибудь такого рода, с версионированием API и примерами. Или хотя бы такого. Но насколько я понимаю ожидать такого не стоит.
Замыкания в JS ровно такие же как и в других языка - некоторая функция, которая использует внешнюю переменную без ручного проброса. Где-то захват автоматический, где-то нужно делать это явно.
всё ещё не понимаю где абстракция, где спека
а это не то и не другое. все зависит от того, насколько вам хочется производительности: где-то вызов функции растворяется, где-то значения копируются, где-то продолжает работать по индирекциям.
Если вы про V8
Не только V8. Имплементаций на самом деле уже немало.
V8 - Node JS, Deno, Chromium based браузеры
Webkit - Safari и весь WebUI в яблочной экосистеме
Gecko - все деривативы Firefox
QuickJS
Bun.
Наверняка во всяких полиглот-виртуальных машинах тоже есть свой набор для компиляции JS.
Не понимаю каким ещё образом можно найти переменную как не через "поиск".
писал же выше - можно скопировать её сразу в место использования, можно вставить ссылку в памяти, можно написать кучку вариантов поиска. Детали тут implementation defined.
Environment Record - это список переменных (bindings)
Складывается впечатление, что они там сами запутались, так что похоже вы правы. Либо у меня эффект Манделы отработал, ибо я был уверен, что в прошлый раз фразы типа `Every Environment Record has an [[OuterEnv]] field, ` была просто `Every Environment has`. Это не считая, что ещё есть host environment. Похоже тут вы правы - разницы действительно нет.
так они же no_std используют и фактически имеют собственный отдельный std. В том числе и по лицензионным причинам. Собственно Охеда года полтора примерно потратил для создания этой всей базовой инфраструктуры для использования ржавого кода.
а чего перестали? почему вы пишете мертвечину вместо воскрешения родных диалектов? какое отношение борьба совков с безграмотностью связана с тем, что у испаноязов европы и южной америки разные диалекты, причем зачастую несовместимые?
найдёте в спеке механизм абстрактных фабрик или интерфейсов? Конечно же нет. Это всё метапонятия из CS и не имеют отношения к непосредственно языку. Ровно по этой же причине в спеке не описываются функторы, монады, кариррование и прочее. Замыкания в этом же списке. Спецификация описывает возможности языка и как должно работать. Что из этого можно собрать никак не декларируется. Поэтому искать замыкания в спеке не имеет смысла.
Можете скинуть подтверждение разницы механизмов и их описание из любого источника?
откройте хотя бы ту же википедию и почитайте про замыкания. А пока у вас индукция с дедукцией путаются.
Про Environment Record как список записей
ещё раз record - это одна запись, окружение - коллекция/список этих записей.
Замыкание это не поиск переменных, а то, как внешняя переменная оказывается в локальном контексте.
Поиск - это переход от внутреннего к внешнему - сначала ищем есть ли значение в локальном контексте, если нет, то смотрим в контексте повыше через OuterEnv и дальше по необходимости в следующий OuterEnv и так вплоть до глобального контекста.
Замыкание - от внешнего к внутреннему - как значение переменной оказывается в месте его использования. Можете взять из глобального окружения, можете дать ссылку на в памяти из текущего контекста, можете скопировать или даже переместить её полностью - стратегий много, причем многие могут сосуществовать. В случае с ES спеки - через референсы в новое окружение.
Environment != Environment Record. Вы же не зовёте предложение/абзац/главу в книге книгой - так и тут. В моём примере ключ-значение это как раз Record. То есть x:34 или this -> [[foo]] будут такими записями. Коллекция таких записей уже зовётся окружением/контекстом (в общем смысле).
что переменные внутри функции уже в момент создания "знают" на что ссылаться.
момент резолюции ссылок вроде не опрделён явно. Так что до вычисления оно вполне может быть ссылкой на ссылку на ссылку на ссылку на ... а получение значения хоть в момент выполнения конкретной строчки, хоть на этапе компиляции местным оптимизатором инлайнится.
рассказывался только способ нахождения значений - как раз то место где вы про рекурсию писали. В реальности опять же подобные индирекции могут не использоваться вовсе из-за оптимизаций.
у объектов функций есть поле [[Environment]]
Это тоже детали имплементации, причём конкретных девтулзов. В примере естестевенно пропущено куча полей, которые в действительности там будут - и всякие встроеные свойства (тот же prototype) и автосгенерённые ссылки на разное. И похоже все эти [[blabla]] мета-поля тоже недавно появились ибо я не знаю что в них обычно складируют. Ради оптимизаций все эти скоупы могут вполне быть где-то в общей линейной памяти с помеченные некоторым битовым маркером ради сокращений непрямых обращений после прохода JIT оптимизатора - естественно к языку это имеет довольно опосредованное отношение.
код на Bash взял из chatgpt, могу ошибаться =) хотел узнать какие языки решили проблему фунарга иначе.
ну, кстати, если хочется посомотреть немного разницы, то можно попробовать посравнивать с Lua. Правда у того спеки нет. Но во многом похож на JS/EcmaScript - прототипы и метатаблицы, оба гоняют на виртуальной машине. оба имеют упрощеную лексику для работы как с глобальным так и с локальным окружением (читай областью видимости), резолюция модулей и вот это вот все. Правда код Lua (который PUC Rio) несравнимо меньше хотя бы того же V8 и даже вроде quickjs, но последнее не точно.
Смотря с чем сравнивать и какой код сравнивать. Шаблоны и прочее метапрограмирование нигде не читается хорошо. Линейный код в виде цепочек обычно чище, будь то Java или плюсы или как тут - в Rust.
А на Godbolt эксперименты уже завезли?
Пока json в гта не выстрелил в ногу
tldr: дублируют файлы, чтобы при чтении ассетов не крутить лишний раз шпинделя ваших HDD. якобы они делают так, чтобы текстуры к пропам при чтении оказывались на диске рядом. То есть скорее всего запекают текстуру в модель, даже если другая модель использует ту же текстуру. Звучит как сомнительная оптимизация.
Я так понимаю почти у каждого продукта есть по справочнику, но у всех разные версии и даты публикации. Офис на Альте и Офис Плюс ссылаются на 2022, для дома и домашняя версия - на новый, для образования - третий вариант, хотя по составу не уверен, что есть разница с домашними кроме как в версии чего-то на титульнике - 3.5E (видимо Educational) vs 3.5H (Home)
И как «Справочник макрокоманд на языке программирования Lua» оно присутствует только в "МойОфис для дома", который ещё надо не перепутать с "МойОфис Стандартный. Домашняя версия", у которого этот же мануал назван просто "Справочник макрокоманд" и ни одно из страниц документаций с этими руководствами не ищется через поиск на сайте адекватным образом - не уверен что даже среди 1347 результатов найдётся тот самый.
gcc 4.9 это я конечно от балды сказал, подсмотрев какие версии compiler explorer поддерживает. Речь скорее за ситуацию, когда зависимости требуют одновременно и несколько древние (но присутствовавшие и ещё не выпиленные) и свежие зависимости и все, которых могло и не существовать на момент существования прошлых зависимостей. Собственно обратная ситуация тоже возможна - например debian по-умолчанию использует gcc 12 и clang 14, а мы например хотим собирать код С++20 компиляторами с их стабильной поддержкой - то бишь gcc не старше 14 и clang не ранее 19. trunk версии там ещё выше, естественнно.
это какое-то наше произвольное имя, которое мы задаём, так?
вот этот момент кстати тоже несколько непонятен. Мне казалось, что мы где-то явно указываем, что входит в окружение develop и что помимо develop есть ещё другие варианты, но в примере вашего скрипта develop нигде явно не упоминался.
Так, а если скажем хочется какой-нибудь gcc 4.9.X, но при этом в составе иметь какой-нибудь пакет под rust 1.92, то как все это стыкуется? Каждый срез nixpkgs содержит весь срез прошлых версий?
Так это ж краулеры, а не реквесты самих чатботов, им ваши промпт инъекции по барабану. Врядли там какой-нибудь самомодифицирующийся код.
Прикольно, теперь у меня есть две ссылки на немного разные документы.
Всё же было бы неплохо иметь некоторый онлайн гайд, что-нибудь такого рода, с версионированием API и примерами. Или хотя бы такого. Но насколько я понимаю ожидать такого не стоит.
А как зафиксировать версии компиляторов-то? Для герметичной сборки вроде как необходимость.
Можно ещё всякие Meson, который немного читаемее, но там в среднем все те же проблемы.
Странно тогда, почему они на неё не сослались в статье ни разу. Это оно? Нигде референса конкретно для Lua не увидел
Замыкания в JS ровно такие же как и в других языка - некоторая функция, которая использует внешнюю переменную без ручного проброса. Где-то захват автоматический, где-то нужно делать это явно.
а это не то и не другое. все зависит от того, насколько вам хочется производительности: где-то вызов функции растворяется, где-то значения копируются, где-то продолжает работать по индирекциям.
Не только V8. Имплементаций на самом деле уже немало.
V8 - Node JS, Deno, Chromium based браузеры
Webkit - Safari и весь WebUI в яблочной экосистеме
Gecko - все деривативы Firefox
QuickJS
Bun.
Наверняка во всяких полиглот-виртуальных машинах тоже есть свой набор для компиляции JS.
писал же выше - можно скопировать её сразу в место использования, можно вставить ссылку в памяти, можно написать кучку вариантов поиска. Детали тут implementation defined.
Складывается впечатление, что они там сами запутались, так что похоже вы правы. Либо у меня эффект Манделы отработал, ибо я был уверен, что в прошлый раз фразы типа `Every Environment Record has an [[OuterEnv]] field, ` была просто `Every Environment has`. Это не считая, что ещё есть host environment. Похоже тут вы правы - разницы действительно нет.
так они же no_std используют и фактически имеют собственный отдельный std. В том числе и по лицензионным причинам. Собственно Охеда года полтора примерно потратил для создания этой всей базовой инфраструктуры для использования ржавого кода.
Вы не поверите
а чего перестали? почему вы пишете мертвечину вместо воскрешения родных диалектов? какое отношение борьба совков с безграмотностью связана с тем, что у испаноязов европы и южной америки разные диалекты, причем зачастую несовместимые?
найдёте в спеке механизм абстрактных фабрик или интерфейсов? Конечно же нет. Это всё метапонятия из CS и не имеют отношения к непосредственно языку. Ровно по этой же причине в спеке не описываются функторы, монады, кариррование и прочее. Замыкания в этом же списке. Спецификация описывает возможности языка и как должно работать. Что из этого можно собрать никак не декларируется. Поэтому искать замыкания в спеке не имеет смысла.
откройте хотя бы ту же википедию и почитайте про замыкания. А пока у вас индукция с дедукцией путаются.
ещё раз record - это одна запись, окружение - коллекция/список этих записей.
Замыкание это не поиск переменных, а то, как внешняя переменная оказывается в локальном контексте.
Поиск - это переход от внутреннего к внешнему - сначала ищем есть ли значение в локальном контексте, если нет, то смотрим в контексте повыше через OuterEnv и дальше по необходимости в следующий OuterEnv и так вплоть до глобального контекста.
Замыкание - от внешнего к внутреннему - как значение переменной оказывается в месте его использования. Можете взять из глобального окружения, можете дать ссылку на в памяти из текущего контекста, можете скопировать или даже переместить её полностью - стратегий много, причем многие могут сосуществовать. В случае с ES спеки - через референсы в новое окружение.
Environment != Environment Record. Вы же не зовёте предложение/абзац/главу в книге книгой - так и тут. В моём примере ключ-значение это как раз Record. То есть
x:34
илиthis -> [[foo]]
будут такими записями. Коллекция таких записей уже зовётся окружением/контекстом (в общем смысле).момент резолюции ссылок вроде не опрделён явно. Так что до вычисления оно вполне может быть ссылкой на ссылку на ссылку на ссылку на ... а получение значения хоть в момент выполнения конкретной строчки, хоть на этапе компиляции местным оптимизатором инлайнится.
рассказывался только способ нахождения значений - как раз то место где вы про рекурсию писали. В реальности опять же подобные индирекции могут не использоваться вовсе из-за оптимизаций.
Это тоже детали имплементации, причём конкретных девтулзов. В примере естестевенно пропущено куча полей, которые в действительности там будут - и всякие встроеные свойства (тот же prototype) и автосгенерённые ссылки на разное. И похоже все эти
[[blabla]]
мета-поля тоже недавно появились ибо я не знаю что в них обычно складируют. Ради оптимизаций все эти скоупы могут вполне быть где-то в общей линейной памяти с помеченные некоторым битовым маркером ради сокращений непрямых обращений после прохода JIT оптимизатора - естественно к языку это имеет довольно опосредованное отношение.ну, кстати, если хочется посомотреть немного разницы, то можно попробовать посравнивать с Lua. Правда у того спеки нет. Но во многом похож на JS/EcmaScript - прототипы и метатаблицы, оба гоняют на виртуальной машине. оба имеют упрощеную лексику для работы как с глобальным так и с локальным окружением (читай областью видимости), резолюция модулей и вот это вот все. Правда код Lua (который PUC Rio) несравнимо меньше хотя бы того же V8 и даже вроде quickjs, но последнее не точно.