Я представляю индексы массива как позиции границ между элементами, а не сами элементы. Как то так. Тогда все операции и индексами, интервалами и адресами становятся очевидны. Пример использования: стек вызовов.
Вы продолжаете путать индексы с сдвигами.
Я всегда говорю «отрезок от а, до b», подразумевая полуинтервал.
Проверяете терпение людей ?))
Если надо, в начале документации написать «везде используются полуинтервалы».
Ну чтобы добить людей пишите сразу «отрезок - это иногда полуинтервал, иногда вектор, а иногда слонёнок»
Тут в тредике свидетели Иеговы JS пишут standalone-приложения на, потому и пытаются рассматривать Lua как самостоятельный язык. Я выше писал про сову на глобус и троллейбус из хлеба.
там скриптуха не рулит какими-то терабайтными структурами
Что не мешает ей сожрать лишний гигабайт в некоторых юзкейсах. В Lua это сделать немного сложнее (если не отключать GC принудительно), но всё равно несложно.
В СУБД Cronos он встроен, насколько я понимаю, потому что замечательно подходит под идеологию многомерных данных. Чертовски удобно, когда и БД, и её встроенный язык в любой момент времени могут трактовать любое значение, как массив значений. В lua, опять - как я понимаю, «всё есть таблица». Другими терминами в постреляционных СУБД это тоже самое. Как json, в каком-то смысле, видимо.
Правда с «настоящим» lua никогда не работал. Как он встроен в Cronos мне нравилось.
Сделать с нуля динамическую загрузку и линковку не сложно, много ресурсов она не занимает.
Какая линковка в embedded?! xD
Лучше компилять, чем недоязык.
Лучше молчать, чем в очередной раз облажаться. Бесплатный совет от меня.
Ты в этом треде уже много раз показал что ты в вопросе некомпетентен, так сделай одолжение (в первую очередь себе), не лезь в споры в которых не можешь ничего добавить по делу.
Хоть раз соверши в этом треде мудрый поступок, не отвечай на этот комментарий. ☺
Хоть раз соверши в этом треде мудрый поступок, не отвечай на этот комментарий. ☺
Может бред скажу, но с недавнего времени я заметил, что этого пациента X512 стало ОЧЕНЬ много на лоре, и в каждой, абсолютно каждой теме он спешит продемонстрировать свое экспертное мнение, и отстаивает его с упорностью упрямого подростка. Такой себе Фрактал, зачем то лезущий еще и в технические темы, тот хоть знал свой уровень. Вообщем, в полку Специалистов По Всему прибыло.
Прямо зависит от того, чем наполнить игру. Причем, если нагрузить до предела в 2008 году компьютеры тех времен было несложно, то сегодня придеться постараться, установив сотни аддонов, подгрузив невероятных размеров карту и расставив десятки тысяч объектов.
я именно про скрипты, а не объекты/текстуры, есть сервера пустышки(с малым количеством объектов/текстурок), так вот на таких серверах даже в связке с i7 + 1060, не будет выше 100 фпс, можно попробовать поиграться с gmod_mcore_test/mat_queue_mode и прочим, но это почти никак не влияет, а ещё я раньше поражался от количества от говно скриптов, которые сыпались варнингами, и да, нужно бы заного потыкать гмод, посмотреть что там наделали, мб сейчас уже оптимизацию завезли
Никогда не писал плагинов (или как они там называются, суть одна) под Photoshop. Честно говоря для меня это новость.
А nginx?
Про возможность расширять nginx с помощью Lua знаю, про возможность расширять его с помощью JavaScript слышу впервые. Загуглил — действительно; я просплоупочил три года с мелочью… да и фиг с ним! ☺
ещё бы какой-нибудь LuaWEB/LuaTANGLE LitLua.lua в луаемакс встроить бы и луатехом писать, писать себе вдругорядь литературно-грамотное – невозбранно достигнув желаемого
ещё бы какой-нибудь LuaWEB/LuaTANGLE LitLua.lua в луаемакс встроить бы
на худой конец и FunnelWEB какой-нибудь зайдёт. с несколькими typesetters для доки в WEAVE и нейтральный от языка кодинга для TANGLE (в отличие от CWEB/CTANGLE классического, который к сишке и теху гвоздями приколочен)
ещё одна находка месяца: по ходу, у PL/I-KT компилятора с pl1.su начала появляться нормальная документация и статьи по реализации компилятора.
вообще интересный этот тулчейн:
Digital PL/I-86 от Гари Килдала, изначально под CP/M, портированный под 8086 (линкер ещё в OMF генерит)
PL/M реализация в CP/M
RASM ассемблер (по ходу как бы не на PL/M или этом вот subset G комплиляторе).
далее, внезапно – мета уровень и расширяемость:
ключевые слова не зарезервированы в PL/I, и следовательно можно расширять собственной реализацией. например, автор PL/I-КТ кириллические аналоги ввёл.
в самом PL/I есть встроенный ассемблер. в тулчейне изначально был отдельный линкер, либрариан, ассемблер и компилятор. в PL/I-КТ объединили всё это + файл ресурсов с библиотеками в один самодостаточный бинарь в 1.8 Мб. и это – почти всё чтобы вступать и компилировать (часть хедеров к винлибам встроена в ресурсный файл, но вообще не помешает взять какой-нибудь asmc или uasm и оттуда добавить).
примеры вдохновляющие: работа с directX из PL/I, проверка размерности физических величин
вообще судя по статьям компилятор и язык довольно сильно доработаны. такой вполне себе приятный алгол/паскаль/оберон/пл\М/ pl/I subset G.
RASM расширяемый ассемблер, по сути похож на FASMG с настраиваемыми макросами поддержкой ISA. есть статья про реализацию макросов – очень круто: в RASM 8086 который изначально 16-битный были макросами добавлена поддержка i386, MMX, SSE, x86-64, 3Dnow, AVX и прочая прочая. что доставляет == что почти все доработано макросами.
PL/I расширяемый язык: например CALL FOOBAR TASK/ CALL FOOBAR TASK STOP с многопоточностью, те же алиасы с кириллическими ключевыми словами, прочее.
здесь вдохновляющий пример относится к примеру кода под VisualAge PL/I IBM-овскому компилятор, где препроцессором сделали реализацию PARSE dsl из REXX в PL/I, через ручное конструирование строк.
статьи вообще на сайте pl1.su неплохие, про реализацию компилятора и языка, так или иначе. из них что запомнилось: про RASM-64, про реализованную проверку физических размерностей, про патченье ведра ntoskrnl.exe из XP для шедулера посредством монитора с отладчиком, встроенным в генерируемый бинарник на PL/I (загрузили EXE, mmap-нули, поменяли пару байт и сохранили новое ведро).
вообще автор PL/I-КТ зело крут: пилит себе невозбранно идеальный транслятор, и полностью импортозамещён: один-единственный бинарник в 1.8 Мб с конпелятором/ассемблером/линкером/библиотекатем/хедерами стандартных библиотек в ресурсах – это всё, полный full stack (lol_ъ_) который нужен для разработки на таком вот идеальном самодостаточном компиляторе.
хотя в форках wlink/wasm из OpenWatcom : jwasm, asmc, uasm немного дальше продвинулись (нормальный ELF, MachO, COFF .exe из коробки), да и тот же fasmg емнип есть тоже подо всё сразу.
но ты зацени идею: а) расширяемый ассемблер, с макросами адаптируемыми микрокодом под любую архитектуру, в том числе ещё и не написанную б) расширяемый язык со свободными ключевыми словами, которые новые свои можно добавлять невозбранно, ….
… в) расширяемый скриптовый язык – REXX (по сути, очень похож на PL/I, опять же см. реализацию PARSE из REXX – на препроцессоре PL/I – то есть, внезапно, скриптуха становится конпелируемой)
… здесь добавить метаязыков по вкусу расширяющих
…. z) и завернуть в итоге в какое-то литературно-грамотное типа примеров из FunnelWeb и ELI.
здесь конечно для полноты ощущений надобно бы переписать FunnelWeb на PL/I, а сам PL/I – на ELI.
эдакий метапрог сам на себе получается.
и забабахать на нём майнфрейм какой-нибудь в духе мультикса православного – попсовым юниксом ещё не испорченного, ога :)
Интерпретатор jscript (майкрософтовская имплементация es) был встроен в винду из коробки со времен win9x. Куча постинсталлов, шел скриптов, и прочей сервисной лабуды особенно в то время писалось скриптовалось на жс не в вебе.
За последние 10 лет жс встроили в качестве скриптового языка во множество популярных СУБД, в том числе на нем можно писать хранимые процедуры. В том числе в те СУБД, где раньше была встроена lua (как произошло и нгниксом. казалось бы, зачем жс, если уже есть луа?). А во многих субд жс был основным языком изначально (в основном nosql движки).
Вообще огромное заблуждение большинства о том, что жс разрабаывался только чтобы скриптовать веб, или, как любят говорить - анимировать снежинки. С самого начала js, еще за 14 лет до появления ноды был встроен в Netscape Enterprise Server, самими создателями js - нетскейпом, чтобы использовать его на серверной-стороне. А сам жс рассматривался как один из основных языков для платформы Netscape ONE. Если почитать нетскейповские роадмапы, у них вообще были наполеоновские планы, они в целом хотели сделать веб именно таким, какой он есть теперь - вебом приложений, а не гипертекста, только через призму тех технологий что были у них на руках в то время. И это все происходило, еще даже до ES3, когда в жс не было ничего буквально (даже прототипов не было, и оператора ===). https://sun9-61.userapi.com/YKJX28fOAbl9Ms3DtTVMHwOrGV-2Pi3Jgkj1Yg/zglCOgRGeyQ.jpg
Еще любители хейтить жс часто приводят как аргумент срок проектирования жс в 10 дней и никто никогда не уточняет, почему этот срок был именно таковым. А все дело в простой конкруенции за основной язык в браузерах, о чем прямо пишет Айк в своем твиттере. Если бы они не успели релизнуть жс до июня, майкрософт популяризовали бы vbscript. И вместо жса, был бы бейсик. Не факт, что навсегда, но учитывая то, что нетскпей в итоге проиграл войну браузеров именно ие, то на следующие 12 лет точно.
Интерпретатор jscript (майкрософтовская имплементация es) был встроен в винду из коробки со времен win9x. Куча постинсталлов, шел скриптов, и прочей сервисной лабуды особенно в то время писалось скриптовалось на жс не в вебе
+1, из-за ActiveScripting API JScript иногда находится в странных местах.
вот, к примеру из плагинов AkelPad EvalCmd.js
// http://akelpad.sourceforge.net/en/plugins.php#Scripts
// Version: 1.2
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Evaluates an expression passed through command line.
//
// Flags - first number in expression (sum of the following):
// 0x1 replace \ with \\.
// 0x2 expand AkelPad variables:
// %f active file.
// %d directory of active file.
// %a AkelPad's directory.
// 0x4 expand escaped symbols:
// %xx escape symbol xx is equivalent to the hexadecimal number representing the character.
// For example, "%5Cn" equal to new line character "\n".
//
// Usage without flags:
// Call("Scripts::Main", 1, "EvalCmd.js", `AkelPad.ReplaceSel("Line 1\nLine 2");`)
//
// Usage with flags:
// Call("Scripts::Main", 1, "EvalCmd.js", `0x1; AkelPad.OpenFile("C:\File.txt");`)
//
//
// Description(1049): Обработать выражение, переданное через командную строку.
//
// Флаги - первое число в выражении (сумма следующих):
// 0x1 заменить \ на \\.
// 0x2 развернуть переменные AkelPad:
// %f активный файл.
// %d директория активного файла.
// %a директория AkelPad'а.
// 0x4 развернуть экранированные символы:
// %xx символ экранирования xx эквивалентно шестнадцатеричному коду символа.
// Например, "%5Cn" эквивалентно символу новой строки "\n".
//
// Применение без флагов:
// Call("Scripts::Main", 1, "EvalCmd.js", `AkelPad.ReplaceSel("Line 1\nLine 2");`)
//
// Применение с флагами:
// Call("Scripts::Main", 1, "EvalCmd.js", `0x1; AkelPad.OpenFile("C:\File.txt");`)
var pArgLine;
var dwFlags;
if (pArgLine=AkelPad.GetArgLine())
{
AkelPad.ScriptNoMutex();
//Get flags
dwFlags=parseInt(pArgLine);
if (!isNaN(dwFlags))
{
var bHex=pArgLine.substr(0, 2) == "0x";
var nSemicolonOffset=dwFlags.toString(bHex?16:10).length + (bHex?2:0);
if (pArgLine.substr(nSemicolonOffset, 1) == ";")
{
pArgLine=pArgLine.substr(nSemicolonOffset + 1);
if (dwFlags & 0x1)
{
pArgLine=pArgLine.replace(/\\/g, "\\\\");
}
if (dwFlags & 0x2)
{
if (/%f|%d|%a/.test(pArgLine))
{
var pFile=AkelPad.GetEditFile(0).replace(/\\/g, "\\\\");
var pFileDir=pFile.substr(0, pFile.lastIndexOf("\\\\"));
var pAkelDir=AkelPad.GetAkelDir().replace(/\\/g, "\\\\");
pArgLine=pArgLine.replace(/%f/g, pFile);
pArgLine=pArgLine.replace(/%d/g, pFileDir);
pArgLine=pArgLine.replace(/%a/g, pAkelDir);
}
}
if (dwFlags & 0x4)
{
pArgLine=unescape(pArgLine);
}
}
}
eval(pArgLine);
}
я так понимаю, блокнот емаксовый жопоскриптом скриптуется. интерфейс плагинов реализован через DLL которые благодаря IActiveScriptSite вызываются жопоскриптом.
тулбар, меню, диалоги, редактирование буфера и синтаксическая раскраска не говоря уже о банальном eval и калькуляторе – заворачиваются в жопоскрипт.
Еще любители хейтить жс часто приводят как аргумент срок проектирования жс в 10 дней и никто никогда не уточняет, почему этот срок был именно таковым. А все дело в
или вот тебе – спеллчекер через ворд через COM API
// http://akelpad.sourceforge.net/en/plugins.php#Scripts
// Version: 1.3
// Author: Shengalts Aleksander aka Instructor
//
// Description(1033): Spell check using Microsoft Word.
// Description(1049): Проверка орфографии, используя Microsoft Word.
//Variables
var Word=new ActiveXObject("Word.application");
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var pSelText=AkelPad.GetSelText();
if (hWndEdit)
{
if (Word)
{
if (pSelText)
{
var oSpellDoc;
var pMessage;
var pTextIn;
var pTextOut;
Word.Visible=false;
Word.Options.SuggestSpellingCorrections=true;
if (oSpellDoc=Word.Documents.Add())
{
oSpellDoc.Content.Text=pSelText;
Word.ActiveWindow.WindowState=2; //wdWindowStateMinimize
if (parseInt(Word.Version) >= 15)
{
//MS Word 2013 and higher
Word.Visible=false;
oSys.Call("user32::SetForegroundWindow", oSpellDoc.ActiveWindow.Hwnd);
}
pTextIn=oSpellDoc.Content.Text;
if (Word.Options.CheckGrammarWithSpelling == true)
oSpellDoc.CheckGrammar();
else
oSpellDoc.CheckSpelling();
pTextOut=oSpellDoc.Content.Text;
oSpellDoc.Close(false);
}
Word.Quit(true);
Word=0;
if (pTextIn == pTextOut)
{
AkelPad.MessageBox(hMainWnd, GetLangString(2), WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);
}
else
{
if (AkelPad.MessageBox(hMainWnd, GetLangString(3), WScript.ScriptName, 36 /*MB_ICONQUESTION|MB_YESNO*/) == 6 /*IDYES*/)
{
AkelPad.ReplaceSel(pTextOut.substr(0, pTextOut.length - 1), -2);
}
}
}
else AkelPad.MessageBox(hMainWnd, GetLangString(1), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}
else AkelPad.MessageBox(hMainWnd, GetLangString(0), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}
if (Word) Word.Quit(true);
//Functions
function GetLangString(nStringID)
{
var nLangID=AkelPad.GetLangId(1 /*LANGID_PRIMARY*/);
if (nLangID == 0x19) //LANG_RUSSIAN
{
if (nStringID == 0)
return "\u041D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0020\u0441\u043D\u0430\u0447\u0430\u043B\u0430\u0020\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C\u0020\u004D\u0069\u0063\u0072\u006F\u0073\u006F\u0066\u0074\u0020\u0057\u006F\u0072\u0064\u0020\u0039\u0037\u0020\u0438\u043B\u0438\u0020\u0432\u044B\u0448\u0435\u002E";
if (nStringID == 1)
return "\u041E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\u0020\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439\u0020\u0442\u0435\u043A\u0441\u0442\u002E";
if (nStringID == 2)
return "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F\u0020\u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442\u002E";
if (nStringID == 3)
return "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C\u0020\u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0439\u0020\u0442\u0435\u043A\u0441\u0442\u003F";
}
else
{
if (nStringID == 0)
return "You must first install Microsoft Word 97 or higher.";
if (nStringID == 1)
return "No text selected.";
if (nStringID == 2)
return "No spelling corrections made.";
if (nStringID == 3)
return "Insert corrected text?";
}
return "";
}
- Очень простой и лаконичный язык, при этом достаточно мощный - Скорость luajit — nuff said (если кто-то заикнётся, что V8 сравнялся с luajit — гоните его ссаными тряпками) - Очень удобный API для написания сишных модулей (а ещё есть ffi) - Встраивается в nginx (на самом деле — встраивается куда угодно)
этого хватит? куда интереснее был бы вопрос: «почему не Lua?»
ответ один, но зато какой: типы. точнее, их отсутствие.
Ravi, вроде как, пришёл исправить сие недоразумение, но это явно не production-grade решение.
Ладно, вы ничего не хотите, наброшу я.
Пробежался по мануалу. Стандартная либа - говно даже по сравнению с js, в котором её по сути-то нет. Сравнивать со стандартной либой ноды даже не имеет смысла.
Массивов и set'ов нет как класса. Аналогов map/reduce/filter - нет. Асинхронного выполнения нет. Генераторов не увидел. Не понятно, что там с замыканиями. Есть исключения на уровне луа? Там в ключевых должен быть try..catch..throw, его нет. Что с регулярками? Что с деструктивным присваиванием?
С другой стороны. Что там такого есть? Метатаблицы? Так и в js есть такие же объекты, которые делают всё тоже самое. Чем метатаблицы лучше? Перегрузки операторов только что умеют делать (хотя в quickjs они тоже есть).
И что в итоге? Точно такая же динамическая скриптуха построенная вокруг хешмапа/метатаблицы, потому что оная не может принципиально быть сделана по-другому. В js, естественно, больше сахара и всяких фич и либ в связи с большей распространённостью.
Зато как фанбои пыжились в этом треде, ну ничего, может еще чем-то удивят.
ТБХ увидел гораздо больше хейтеров уровня тебя с аргументацией вида «фу, индексы с единицы» и «хочу мильён библиотек и супер-производительность в языке для скриптухи и DSLей».