LINUX.ORG.RU

Lua 5.5.0

 , ,

Lua 5.5.0

0

6

15 декабря, спустя примерно шесть месяцев после публикации предварительной бета версии, утверждён, сформирован и опубликован стабильный выпуск 5.5.0 языка программирования Lua.

Финальное уведомление сообщества о событии произошло вчера, 22 декабря, в списке рассылки.

Lua – это встраиваемый, интерпретируемый язык программирования, используемый в огромном числе программных продуктов как язык-компаньон.

Благодарим всех, кто принял участие в тестировании и обсуждениях.
И просто всех тех, кто просто пользуется языком Lua для решения своих, как повседневных, так и производственных, промышленных, задач. Спасибо!


Основные изменения по отношению к предыдущей версии языка 5.4.8:

  • Новое ключевое слово global служит для управления глобальной областью видимости. Сразу стоит уточнить, это не просто противоположность ключевому слову local. По умолчанию в каждом исполняемом чанке, происходит неявное объявление global *, при этом ничего не происходит – код работает точно так же, как и прежде. Объявление global со звёздочкой * указывает на то, что все глобальные переменные просто доступны глобально. При желании можно записать это явно, например:

    global *
    print(math.pi)
    

    Таким образом сохраняется старое поведение.

    Если же через global объявить переменную, то вся глобальная область видимости удаляется и в глобальной области видимости будет только эта и все последующие явно декларированные переменные как глобальные, попытка обратится к неявно декларированной глобальной переменной или неявно создать её приведёт к ошибке.

    global x  -- очистить глобальную область видимости и внести в неё "x"
    x = 42    -- допустимо, "х" в глобальной области видимости чанка
    y = 42    -- ошибка переменная "y" не определена
    print(x+y) -- ошибка функция "print" не определена
    

    Если вы используете ключевое слово global не с * то после его использования требуется явно декларировать все используемые вами глобальные переменные:

    global x, y, print
    x = 42
    y = 42
    print(x+y)
    

    или

    global x
    global y
    global print
    print(x+y)
    

    Тем самым вы можете изолировать модуль, тело функции, тело условия или тело цикла от глобальной области видимости и задать её там явно. Вы можете в любой момент времени указать в коде global *, чтобы вернуть видимость всех глобальных переменных назад, для всего последующего за этим объявлением кода. Можно сделать константными все глобальные переменные:

    global <const> *
    

    При этом важно отметить, что global <const>, будучи применённый к таблице, делает константной только таблицу – нельзя перезаписать саму таблицу, но можно перезаписать значения её «ключей» и добавлять новые.

    global <const> math, print -- или global <const> *
    math.pi = 42
    print(math.pi)
    

    Будет выведено 42. Читайте документацию и обсуждение, экспериментируйте.

  • Для обратной совместимости с прошлыми версиями языка, по причине того, что global может использоваться как имя переменной, сейчас возможно использование этого имени и как имени переменной, и как ключевого слова:

    local global = 42
    print(global)
    global <const> x
    x = 42  -- сработает ошибка 
    

    Это поведение обратной совместимости можно отключить на этапе сборки, отключив LUA_COMPAT_GLOBAL.

Другие изменения:

  • Счётчики в циклах for отныне являются константами, попытка их изменения вызывает ошибку, в Lua 5.4 и ниже, изменение значение счётчика в цикле сбрасывалось на следующее значение счётчика, так как счётчики циклов не изменяемые:
for i=1,100 do
    i = 10  -- ошибка для Lua 5.5
    print(i)
end

Если вам нужна переменная с именем счётчика, и совместимость с предыдущими версиями языка, то объявите её как local:

for i=1,100 do
    local i = 10
    print(i)
end
  • float значения печатаются с таким количеством знаков, чтобы быть правильно сконвертированными обратно.
  • Новая функция table.create создаёт новую таблицу с предварительно выделенной памятью, это полезно с точки зрения производительности, когда вы сразу знаете сколько элементов будет в таблице.
  • utf8.offset теперь дополнительно возвращает финальную позицию символа.
print(utf8.offset("привет",2))

Lua 5.4 и ранее, вернут 3, Lua 5.5 вернёт 3 и 4.

  • Lua C API. Внешние строки (external strings) через lua_pushexternalstring для использования данных в обход автоматического управления памяти, строка должна завершаться \0.
  • Lua C API. Новая функция luaL_openselectedlibs в отличии от luaL_openlibs позволяет выборочно загрузить/предзагрузить, нужные части стандартной библиотеки Lua в package.loaded, package.preload из списка:
   LUA_GLIBK : the basic library.
   LUA_LOADLIBK : the package library.
   LUA_COLIBK : the coroutine library.
   LUA_STRLIBK : the string library.
   LUA_UTF8LIBK : the UTF-8 library.
   LUA_TABLIBK : the table library.
   LUA_MATHLIBK : the mathematical library.
   LUA_IOLIBK : the I/O library.
   LUA_OSLIBK : the operating system library.
   LUA_DBLIBK : the debug library.
  • Оптимизация памяти, большие Lua массивы теперь потребляют до 60% меньше памяти:
collectgarbage("stop")

local array = { }
for i=1,10000000 do
    array[i]=i
end

print(collectgarbage("count") * 1024)

Вывод показателей памяти в байтах (потребление памяти, в этом тесте, упало более чем на 40%):

dron@gnu:~/$ lua5.4 mem.lua
268457462.0
dron@gnu:~/$ lua5.5 mem.lua
151015205.0
  • Возможность возврата сложных конструкций вида:
return {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}}}}}}}

Это не работало в 5.4 и выдавало ошибку «function or expression too complex» или «function or expression needs too many registers».

  • Удалена опция сборки LUA_COMPAT_5_3 (совместимость с 5.3);
  • lua.c загружает функцию readline динамически;
  • удалена опция LUA_USE_READLINE и цели сборки linux-readline and linux-noreadline для Linux.

>>> Релиз Lua5.5 релиза в списке рассылки

>>> Онлайн документация

>>> Прямая ссылка на архив исходного кода

>>> Прямая ссылка на архив с тестами

>>> Инструкции по сборке и установке

>>> Полный исходный код в веб-интерфейсе

>>> Подробности

★★★★★

Проверено: dataman ()
Последнее исправление: CrX (всего исправлений: 14)
Ответ на: комментарий от kaldeon

Паскаль как принцип

реализации - что тот же fpc что тот же Эмбаркадо али кто он теперь - слишком стали нишевыми

как в своё время конфетка TopSpeed Modula(хз 2 али ещё чё) полностью спрятались в клипер0кларион и изчезли с радаров именно серьёзного программирования хотя на момент по качеству компиляции были лучше общедоступных С++ коммерческих копуляторов

т.е. по хорошему что сверх компактное как чутли не свой вариант Оберон системемы полностью без какого либо софта чисто баребон

ну и внешняя обвязка как тоже Inferno - Т.е нечто виртуализируюещее среду для Оберон приложения

qulinxao3 ★☆
()
Ответ на: комментарий от qulinxao3

Ну чот сложное придумываешь. Ты какую задачу решить хочешь? Ты сравниваешь компилируемый язык с легким встраиваемым интерпретатором?

gns ★★★★★
()

Немножко бенчмарков свежайших участников с LuaJIT/LuaJIT-test-cleanup/bench/array3d.lua.

$ hyperfine -N --warmup 5 --export-markdown luas.md "lua $1" "pluto -W $1" "luau -O2 -g0 $1" "luau --codegen -O2 -g0 $1" "luajit -O3 -joff $1" "luajit -O3 $1":

Summary
  luajit -O3 array3d.lua ran
   10.21 ± 0.31 times faster than luau --codegen -O2 -g0 array3d.lua
   11.52 ± 0.79 times faster than luajit -O3 -joff array3d.lua
   16.23 ± 0.30 times faster than luau -O2 -g0 array3d.lua
   20.37 ± 0.24 times faster than lua array3d.lua
   22.42 ± 0.36 times faster than pluto -W array3d.lua

$ cat luas.md:

CommandMean [s]Min [s]Max [s]Relative
lua array3d.lua5.649 ± 0.0545.5795.71720.37 ± 0.24
pluto -W array3d.lua6.220 ± 0.0906.1016.38922.42 ± 0.36
luau -O2 -g0 array3d.lua4.501 ± 0.0764.3994.61616.23 ± 0.30
luau --codegen -O2 -g0 array3d.lua2.833 ± 0.0852.7622.99310.21 ± 0.31
luajit -O3 -joff array3d.lua3.196 ± 0.2192.9963.59211.52 ± 0.79
luajit -O3 array3d.lua0.277 ± 0.0020.2750.2801.00
dataman ★★★★★
()
Ответ на: комментарий от pihter

Уже разобрался что к чему, с помощью ИИ-консультаций. Просто я весьма интересуюсь всякого рода автоматизацией и скриптингом для приложений. А тут фраза «в огромном числе программных продуктов». Постоянно использую кучу программ и вообще никогда, нигде не встречал это чудо-юдо. Но мне пояснили, популярно. Короче, полезный продукт в своих нишах.

rechnick ★★★
()
Ответ на: комментарий от dataman

Запустил array3d.lua на всех версиях Lua что у меня в системе, 5.5.0 собран мной без тюнинга, как есть

dron@gnu:~/Загрузки$ alua array3d.lua 
☺─────────── luajit ────────────☺
time from os.clock(): 0.489884
☺─────────── lua5.1 ────────────☺
time from os.clock(): 19.236969
☺─────────── lua5.2 ────────────☺
time from os.clock(): 19.584742
☺─────────── lua5.3 ────────────☺
time from os.clock(): 17.024109
☺─────────── lua5.4 ────────────☺
time from os.clock(): 14.437791
☺─────────── lua5.5 ────────────☺
time from os.clock(): 11.281924

Прогнал три раза, сильной разницы нет

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от dataman

Это да :), я имею в виду разницы между прогонами бенча, ну дельта между значениями болталась где то в тысячных долях. Проц я фиксировал на 2800 мегагерц.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от splinter

Есть вещи, которые удалены/перенесены по пути от 5.1 до 5.5. Например unpack перенесено в table.unpack если сломалось на этом достаточно объявить

unpack = table.unpack

Перед reqire, даже не трогая сам модуль. Также фикситься всё иное. Есть всего несколько проблем подобных, их количество меньше чем пальцев на руках. Либо оно просто работает, либо легко исправляется в 99% случаев, но всё же, не буду кривить душой иногда костылики нужны, в виде явного слоя совместимости который ты добавляешь в свою программу чтобы она работала на большом количестве версий. У кого-то постоянно с этим проблемы, а у кого-то вообще их нет. Важно понимать, что в lua в целом не сильно то и следят за совместимостью, но базово она есть, так как ниша языка это встраивание, а если у тебя встроена, вшита определённая версия то и пишешь ты для конкретно неё. А уж подготовил тебе сторонний разраб, сторонний модуль под разные версии это как повезёт.

Просто попробуй, если отвалится напиши на ЛОР помогут адаптировать.


Модули в виде mymodule.so сишные не будут работать.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от splinter

я так и не понял как внятно использовать luajit

#!/usr/bin/env luajit

print('Привет этот lua код исполняет luajit')

Разница лишь в вызове интерпретатора.

не понял как мне настроить проект так, что бы интерпретатор и зависимости можно было таскать вместе с проектом.

Там гибчайшая система, хоть пути прописывай, хоть меняй логику загрузки модулей, предзагрузки, перезагрузки, выгрузки, свои механизмы поиска добавляй, что в голову взбредёт то и можно.

А так, минимально, это прописал в package.path в коде или в переменной окружения LUA_PATH что тебе надо включая текущий каталог ./ и всё.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Разница лишь в вызове интерпретатора.

luajit, ЕМНИП, не умеет больше 5.1/5.2, а большинство вкусностей завезли в 5.3, это я к тому, что разница всё-таки есть.

splinter ★★★★★
()
Последнее исправление: splinter (всего исправлений: 1)
Ответ на: комментарий от Smacker

Я уже говорил - как только я взялся за си, я очень быстро втянулся, а в луа так не получается

daniyal
()
Ответ на: комментарий от splinter

Если ты берёшь luajit значит ты осознанно идёшь на компромис, ты лишаешь себя некоторых возможных удобств в обмен на скорость. И наоборот, если ты используешь какую то определённую ванильную версию луа, то ты выбираешь её плюшки вместе с чемоданчиком неудобств по переносу на другие версии, если таковое будет.

Только благодаря тому что луа держится на компромисах между, весомыми плюшками и терпимыми неудобствами она может оставаться компактной, простой, более менее быстрой. Luajit же, это бескомпромиссный и радикальный подход, когда самое важное это скорость, в ущерб всему иному, как вспомогательный плюс получается стабильность, но просто потому чо в нём что-то менять это значит переписывать половину. Ну и luajit из 5.2 некоторые вещи притащило к себе.

Решай просто сам что тебе важнее, скорость или плюшка :) Некоторые используют luajit просто потому что там FFI из коробки, этим людям в целом плевать какая там скорость им просто надо взять произвольную сишную либу и просто с ней работать, без компиляций и прочего.

Лично я стараюсь писать всё сразу с учётом работы на любой версии Lua, модули могу раздельно написать для 5.1+ и 5.3+ например как тут https://gitflic.ru/project/blogdron/lua-base64 можно всё в 1 файл сунуть, но можно и не можно =) Или если делаю утилиту то просто избегаю применения того что разнится в версиях например как тут https://gitflic.ru/project/blogdron/braintractor или наоборот делаю небольшие добавки для совместимости между версиями типа как тут https://gitflic.ru/project/blogdron/pagepack суя модули как просто два куска текста, и подгружаю нужный в зависимости от той версии под которой запустилась программа.

Но это я упарываюсь, пытаясь в универсальность. Часто она просто нахрен не нужна. Например я хочу goto но не использую его, в том что выкладываю чтобы тупо оно работало и там где goto нету и так с кучей всего, хотя локально я в хвост и в гриву его использую.

Вот сам думаю, надо ли иметь 1 программу для всех версий. Или всё же пилить так как удобно, а если надо для другой версии, то запилить просто отдельно для другой версии, даже если там вся разница будет в к примеру есть goto и нет goto ну или там битовые операции. Делема та ещё. Сложный выбор. Пока на первом.

Ахтунг, я говнокодер и нуб. Воспринимай мои слова как бред сивой кобылы в целом, решай для себя всё сам.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)
Ответ на: комментарий от daniyal

в вакууме хороший, но больше 50-ти строк кода превращается в лютые спагетти.

Это вопросы не к Lua, а к программисту. Lua тот же JS, c той же ассоциативной таблицей как основным типом данных, и даже есть переопределние операторов, плюс в Lua есть require и можно отделять модули.

lbvf50txt
()
Ответ на: комментарий от qulinxao3

как в своё время конфетка TopSpeed Modula(хз 2 али ещё чё) полностью спрятались в клипер0кларион и изчезли с радаров именно серьёзного программирования хотя на момент по качеству компиляции были лучше общедоступных С++ коммерческих копуляторов

A что «несерьёзного» в Clarion и куда он «исчез»??..

Somebody ★★★★
()
Ответ на: комментарий от Somebody

ушёл за горизонт событий и полторы суперхумана имеют стол и кров

и тиобефонате и не помнют клаионушку нашу бедную

qulinxao3 ★☆
()
Ответ на: комментарий от gns

ну нет жи

вычищеный алгол => это (если чистил Вирт и его падвываны) Оберон-какая нить инкарнация с определением языка в 17 условных страниц и рантаймам сопоставимой сложности - что делает на таких размерах различия копулируемый али по буквам исполняемый не существеным ибо модель исполнения при таком малом ядре можно на ходу затюнить - вот как то так имха имхавая

qulinxao3 ★☆
()
Ответ на: комментарий от LINUX-ORG-RU

Чисто для сравнения:

➜  array3d lua -v
Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
➜  array3d time lua lua/array3d.lua
89401   89401
lua lua/array3d.lua  5.26s user 0.14s system 99% cpu 5.396 total
➜  array3d luajit -v
LuaJIT 2.1.ROLLING -- Copyright (C) 2005-2023 Mike Pall. https://luajit.org/
➜  array3d time luajit lua/array3d.lua
89401   89401
luajit lua/array3d.lua  0.10s user 0.09s system 99% cpu 0.190 total
➜  array3d guile --version
guile (GNU Guile) 3.0.9
Copyright (C) 2023 Free Software Foundation, Inc.

License LGPLv3+: GNU LGPL 3 or later <http://gnu.org/licenses/lgpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
➜  array3d time guile -s scheme/array3d.scm
89401.0 89401

guile -s scheme/array3d.scm  1.90s user 0.08s system 107% cpu 1.834 total

Вот, кто бы теперь версию для форта запилил. Я, боюсь, не сдюжу.

P.S. Версия для guile, не вполне повторяет оригинал, т.к. есть нормальные многомерные массивы и записи, так чего бы ими не пользоваться?

ugoday ★★★★★
()
Ответ на: комментарий от qulinxao3

Это какой-то разговор в сторону. Мне не интересно обсуждать паскаль в контекстах встраиваемых интерпретируемых языков. И вообще не особо интересно его обсуждать. Я когда-то на нем писал в эпоху масадоса, но с тех пор он мне перестал быть нужным

gns ★★★★★
()
Ответ на: комментарий от splinter

LuaJIT позволяет компилить файлы .lua в обьектные, внутри которых байткод. Я написал небольшой бутстрап на C и линкую все в один исполняемый файл. Так и деплою. Если не юзать либы из luarocks, то никакие зависимости не нужны.

aiker ★★
()
Последнее исправление: aiker (всего исправлений: 2)
Ответ на: комментарий от daniyal

понимание кода на лету. Зыркнул - понял кусок кода.

ты не найдешь ни одного человека, который зная хотя бы один какой-нибудь язык программирования не понял бы строчку for i=1, 100 do куда уж проще-то? :)

pihter ★★★★★
()
Ответ на: комментарий от pihter

если это эзотерический язык программирования https://esolangs.org/wiki/Main_Page

то семантика

for i=1, 100 do

в произвольном таком языке может быть произвольной

ваще упор «на интуитивную ясность A vs B» это ложное восприятие привычности(возможно и более правильной) лучше чуждости(которое возможно от того чуждо что не жизнено и оттого очевидно не может стать привычным)

и да «интуитивная ясность» это упор на консерватизм(буквально) и отказ от образования при подготовке кадров в индустрию

qulinxao3 ★☆
()
Ответ на: комментарий от qulinxao3

это все словесная эквилибристика – ты мне реально найди человека, умеющего программировать хоть что-то, который бы не понял этой строчки. В реальном мире таких людей нет: поэтому и твой тезис про неинтуитивность – он из мира борьбы с ветряными мельницами

pihter ★★★★★
()
Ответ на: комментарий от pihter

ну мой про fro очевидный до_абсурда

при этом всяко стилей вменяемых написания кода больше одного поэтому всегда будет не нулевое трение когда текст не в первом_по_пользованию у читателя стиле

т.е на очевидных строках будет беглое чтение но и при этом правильно приготовленный код будет вводит в заблуждение

в частности 2 примера:

во времена когда была мало распространена была подсветка синтаксиса был очередной «define TRUE 0» c плохозаметным коментом сырца и реальным сырцом в коменте

ну и знаминитое расширение Томсона универсальным логином компилятора системного системы операционой уних

т.е. придерживаться общего стиля необходимо но параною всёж в отрицательные велечины не слудует загонять

мир

qulinxao3 ★☆
()
Ответ на: комментарий от pihter

т.е.

обрыв понимания тем и внезапен - что «что для одного константа для другого переменная»

qulinxao3 ★☆
()
Ответ на: комментарий от pihter

Я уже тыщу раз говорил, дело не в «сложности» синтаксиса, а в быстроте понимания кода на лету, чтобы код как книжку читать, а не как чертёж с мелким шрифтом и размытыми буквами

daniyal
()
Ответ на: комментарий от daniyal

Просто напиши вручную (БЕЗ ИИ) на языке тысяч 30-40 строк кода и начнешь читать его как родной. Что может быть проще? Я все эти симптомы проходил раз за разом и для луа и для других языков. И все это проходило после достаточного количества практики.

Причем проходит все это нелинейно скачками. Вот ты еще не понимаешь чего то и вдруг вжух - все становится кристалльно понятно. И ты уже не понимаешь как вообще мог не осознавать и не воспринимать это все.

Тот же ООП я не мог понять два года, а осознал в один момент - как прозрение. Как раз ровно год назад на новый год.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от daniyal

это привычка скорее насмотренность на идиомы

те жи сверх(необходимого :) ) длинные имена у старательных нубо-буткепмеров(жабе анафема)войтишников вобанки - оно ровно от того что новички(и целые их дивизии) будут эффективны(с них roi больше) когда не имеея запаса идиом будут пулять виршами имён с вкраплениями кода

а потом удивляются от чего поворот (односвязного) списка монблан

qulinxao3 ★☆
()
Ответ на: комментарий от LINUX-ORG-RU

к слову

рекомендую продегустировать

Дейкстра «о вреде goto» как гениальный текст

и кучу «хвалебных ссылок» как пример абсолютного непонимания али незнания статьи - и не очевидно что хуже - непонимания али «пастернака не читал(а) но »

в том числе для понимания что волчистость(ака краснабайство и речекрякство) в индустрии из спокон веков

qulinxao3 ★☆
()
Ответ на: комментарий от daniyal

Многие вещи нам непонятны не потому, что наши понятия слабы, но потому, что сии вещи не входят в круг наших понятий

qulinxao3 ★☆
()
Ответ на: комментарий от sparkie

Значит он тебе и нафиг не нужен. У языка более менее конкретная ниша, и в ней он тоже не один, есть из чего выбрать. Просто как язык, ради языка, просто потому-то, это не про Lua. Вот когда надо и его фишки выстреливают, от тогда да. Но обычно и часто в таком случае ты открываешь для себя всякие Pawn, Lua, AngelScript, Squirrel и так далее, для многих это как на другую планету высадится, настолько все привыкли к заезженному мейнстриму, не подразумевая что за стенкой инопланетные технологии бегают с глазами на ушах.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от splinter

luajit, ЕМНИП, не умеет больше 5.1/5.2, а большинство вкусностей завезли в 5.3

Есть несколько форков LuaJit с различными улучшениями: от OpenResty, LuaVela, RaptorJIT, Ravi… И другие. :)

dataman ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Почитал эту вашу педивикию: да, мне он не нужен особо, достаточно уже тех ЯПов, с которыми работаю.

sparkie ★★★★★
()
Ответ на: комментарий от qulinxao3

Судя по новости, эти самые структуры управления в языке применяются в случайном порядке. И меняются часто, не уследишь :)

gns ★★★★★
()

Фееричные костыли с global. Почему бы сразу не сделать нормально? Надо через 30 лет вот эту ересь придумывать. Бразильские академики, не хухры мухры!

bread
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.