<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; JScript: Фреймворк]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=8865</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=8865&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «JScript: Фреймворк».]]></description>
		<lastBuildDate>Mon, 20 Feb 2017 05:20:24 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112914#p112914</link>
			<description><![CDATA[<p>Del.</p>]]></description>
			<author><![CDATA[null@example.com (Parazit)]]></author>
			<pubDate>Mon, 20 Feb 2017 05:20:24 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112914#p112914</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=93044#p93044</link>
			<description><![CDATA[<p>Черновик фреймворка и кодогенератора. В результате будет создан файл output.js без лишних функций.</p><div class="codebox"><pre><code>
Include(&quot;core&quot;);

function Main()
{
    FileCreateShortcut(GetWindowsDir() + &quot;\\explorer.exe&quot;, GetDesktopDir() + &quot;\\cmd.exe.lnk&quot;, GetWindowsDir(), &quot;/e,c:\\&quot;, &quot;Tooltip description of the shortcut.&quot;, GetSystemDir() + &quot;\\shell32.dll&quot;, &quot;CTRL+ALT+t&quot;, &quot;15&quot;, 7);
    var res = FileGetShortcut(GetDesktopDir() + &quot;\\cmd.exe.lnk&quot;);
    MsgBox(res);
    res[0]=GetWindowsDir() + &quot;\\System32\\calc.exe&quot;;
    FileCreateShortcut.apply(null, res);
    res = FileGetShortcut(GetDesktopDir() + &quot;\\cmd.exe.lnk&quot;);
    MsgBox(res);
    Exit();
}


FwBuildCode(&quot;Main&quot;, &quot;output.js&quot;);
Exit();

// Include.Libs - словарь модулей
// Include.DefaultNameSpace - область видимости по умолчанию
function Include(JsPath, NameSpace)
{
    this.GlobalObject = this;
    var method, module, lib, code, stream;
    var FSO = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);
    var WshShell = new ActiveXObject(&quot;WScript.Shell&quot;);
    
    JsPath = WshShell.ExpandEnvironmentStrings(JsPath);
    // если файла нет, то оканчиваем работу
    
    if (FSO.FolderExists(JsPath)) 
    {
        var files = new Enumerator(FSO.GetFolder(JsPath).Files);
        var scripts = [];
        for (; !files.atEnd(); files.moveNext())
        {
            if (/\.js$/i.test(files.item())) scripts.push(files.item());
        }
       
        for (var i=0; i&lt;scripts.length; i++) Include(scripts[i], NameSpace);
        return true;
    }
    
    if (!FSO.FileExists(JsPath)) return false;
    // избавляемся от относительных путей, формируем полный путь. 
    JsPath = FSO.GetFile(JsPath).Path;
    // устанавливаем пространство имен, на которое будет распространяться импортируемый модуль.
    // если оно не задано в функции, то испортируемые функции подключаются к глобальному объекту (точнее к указателю this).
    if (!arguments.callee.DefaultNameSpace)arguments.callee.DefaultNameSpace = GlobalObject;
    if (!NameSpace) NameSpace = arguments.callee.DefaultNameSpace;
    if (!arguments.callee.Libs) arguments.callee.Libs = {};
    lib = arguments.callee.Libs[JsPath];
    // если модуль ранее подгружался
    if (lib) 
    {
        // то импортируем уже загруженные указатели функций модуля в объект, который кеширует перечень функций
        // нужна оптимизация, которая предотвратит повторное присвоение функций в namespace
        for (method in lib)
        {
            NameSpace[method]=lib[method];
        }
        return true;
    }
    else 
    {
        lib = arguments.callee.Libs[JsPath] = {};
        // если библиотека не подгружалась ранее, то осуществляется ее чтение и интерпретация
        if (FSO.GetFile(JsPath).Size==0) return &quot;&quot;;
        stream = FSO.OpenTextFile(JsPath, 1, 0, -2),
        code = stream.ReadAll();
        stream.Close();
        module = eval(&quot;(&quot;+code+&quot;)&quot;);
        // далее, данные помещаются и в кеш, и в namespace
        for (method in module)
        {
            lib[method]=module[method];
            NameSpace[method]=module[method];
        }
    }
    return true;
}
</code></pre></div><p><a href="https://mega.co.nz/#!xpY2DaAI!0Wf0FycvNAilmvu-X-8pMmO1aRYd3xNdYymnU5NP8oE">https://mega.co.nz/#!xpY2DaAI!0Wf0FycvN … ymnU5NP8oE</a></p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Sun, 05 Apr 2015 22:17:50 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=93044#p93044</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=93010#p93010</link>
			<description><![CDATA[<p>Функция подключения модулей.</p><p>Этот вариант функции пока подключает файл скрипта, можно указать каталог, тогда буду подключены все файлы в каталоге.</p><p>Немного предисловия. Ядро фреймворка состоит из нескольких файлов, функции которых будут лежать в глобальном пространстве. Большая часть функций ядра перечислена в посте № 1. </p><p>Далее, я сделал возможность не только расширения глобального объекта, но и возможность замкнуть это на свой объект. </p><div class="codebox"><pre><code>
var GlobalObject = this;

// Include.Libs - словарь модулей
// Include.DefaultNameSpace - область видимости по умолчанию
function Include(JsPath, NameSpace)
{
    var method, module, lib, code, stream;
    var FSO = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);
    var WshShell = new ActiveXObject(&quot;WScript.Shell&quot;);
    
    JsPath = WshShell.ExpandEnvironmentStrings(JsPath);
    // если файла нет, то оканчиваем работу
    
    if (FSO.FolderExists(JsPath)) 
    {
        var files = new Enumerator(FSO.GetFolder(JsPath).Files);
        var scripts = [];
        for (; !files.atEnd(); files.moveNext())
        {
            if (/\.js$/i.test(files.item())) scripts.push(files.item());
        }
       
        for (var i=0; i&lt;scripts.length; i++) Include(scripts[i], NameSpace);
        return true;
    }
    
    if (!FSO.FileExists(JsPath)) return false;
    // избавляемся от относительных путей, формируем полный путь. 
    JsPath = FSO.GetFile(JsPath).Path;
    // устанавливаем пространство имен, на которое будет распространяться импортируемый модуль.
    // если оно не задано в функции, то испортируемые функции подключаются к глобальному объекту (точнее к указателю this).
    if (!arguments.callee.DefaultNameSpace)arguments.callee.DefaultNameSpace = GlobalObject;
    if (!NameSpace) NameSpace = arguments.callee.DefaultNameSpace;
    if (!arguments.callee.Libs) arguments.callee.Libs = {};
    lib = arguments.callee.Libs[JsPath];
    // если модуль ранее подгружался
    if (lib) 
    {
        // то импортируем уже загруженные указатели функций модуля в объект, который кеширует перечень функций
        // нужна оптимизация, которая предотвратит повторное присвоение функций в namespace
        for (method in lib)
        {
            NameSpace[method]=lib[method];
        }
        return true;
    }
    else 
    {
        lib = arguments.callee.Libs[JsPath] = {};
        // если библиотека не подгружалась ранее, то осуществляется ее чтение и интерпретация
        if (FSO.GetFile(JsPath).Size==0) return &quot;&quot;;
        stream = FSO.OpenTextFile(JsPath, 1, 0, -2),
        code = stream.ReadAll();
        stream.Close();
        module = eval(&quot;(&quot;+code+&quot;)&quot;);
        // далее, данные помещаются и в кеш, и в namespace
        for (method in module)
        {
            lib[method]=module[method];
            NameSpace[method]=module[method];
        }
    }
    return true;
}

   
Include(&quot;test3.js&quot;);
A();

var s = {};
Include(&quot;test3.js&quot;, s);
s.A();

Include.DefaultNameSpace = GlobalObject;     
(function(){
    Include(&quot;test3.js&quot;);
    A();
}
)();
</code></pre></div><p>Модуль выглядит примерно так:<br /></p><div class="codebox"><pre><code>
(
(function (){
    MsgBox(&quot;Hello from module&quot;)
}
)(),

{
A : function () {
    MsgBox(&quot;123&quot;);
},

B : function () {
}

}
)
</code></pre></div><p>Как мы видим есть функция инициализации, которая будет вызвана только один раз, в какой бы неймспейс модуль не подключался бы. Экземпляры функций при разных неймспейсах не создаются дополнительно. Все кешируется. Объектам раздаются указатели на функции. Принципиально отказался от приватных переменных.</p><p>Теперь ядро фреймворка разделяю на файлы, чтобы можно было легко их проверять на корректность. </p><p>Есть проблема отладки, так как используется eval.<br />Также будет добавлена проверка конфликта имен функций модуля.</p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Sun, 05 Apr 2015 09:33:06 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=93010#p93010</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=87264#p87264</link>
			<description><![CDATA[<p>Работа не стоит на месте. </p><p>Решена проблема избыточного кода. Урезается на ура. Остается разобраться с удалением неиспользуемых методов прототипов.</p><p>Итак, в первую очередь вам понадобится <a href="http://dl.google.com/closure-compiler/compiler-latest.zip">Google Closure</a>.<br />Файл compiler.jar расположите рядом с со скриптовым файлом compiler.js. Код compiler.js приведен ниже.</p><p>Для работы бросьте ваш скрипт на compiler.js и получите оптимизированный для исполнения код.</p><div class="codebox"><pre><code>
// compiler.js
// если осуществлялся запуск скрипта без параметра, то завершаем работу.
if (WScript.Arguments.length == 0) WScript.Quit();

var WshShell = new ActiveXObject(&quot;WScript.Shell&quot;);

var FileName = WScript.Arguments(0); // путь файла для обработки.
var FileNameTmp =  GetScriptDir()+GenerateString(12); // временный файл для сохранения промежуточного результата
var FileNameOut =  (/\./.test(FileName) ? FileName.replace(/\.[^\.]+$/, &quot;.out.js&quot;) : (FileName + &quot;.out.js&quot;)); // путь файла с результатами

var FSO = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);
var ForReading = 1,
    ForWriting = 2,
    ForAppending = 8;

// аналог VB-MsgBox в JS
function MsgBox(strText, strTitle, nType) {
    return WshShell.Popup(strText, 0, strTitle, nType);
}

//генерирует строку из случайных символов латиницы цифр.
function GenerateString(L) {
    if (!L) L = 8;
    return new ActiveXObject(&#039;Scriptlet.TypeLib&#039;).Guid.replace(/[^\w]+/g, &quot;&quot;).slice(0, L);
}

// отображаем значение s в диалоговом окне. При нажатии на &quot;отмена&quot; осуществляется выход из кода. 
function alert(s)
{
    return;
    if (MsgBox(s, &quot;&quot;, 1)==2) WScript.Quit();
}

//возвращает директорию расположения скрипта
function GetScriptDir() {
    return GetScriptFullPath().replace(/[^\\]+$/g, &quot;&quot;);
}

//возвращает имя скриптового файла. Универсально для HTA и WSH.
function GetScriptFullPath() {
    if (this.location &amp;&amp; this.location.href) return location.href.replace(/^.+\/\/\//, &quot;&quot;).replace(/\//g, &quot;\\&quot;);
    if (this.WScript) return WScript.ScriptFullName;
    return &quot;&quot;;
}

//устанавливаем директорию нахождения скрипта в качестве рабочей. 
WshShell.CurrentDirectory = GetScriptDir();

// Открываем файл и читаем код
var f = FSO.OpenTextFile(FileName, 1, 0, -2);
var source = f.ReadAll();
f.Close();

//парсим js-код, выявляем конструкции языка: регулярные выражения, комментарии, строковые литералы.
//на выходе имеем двухуровневый массив [тип_конструкции][значение].
var tmp = ParseJS(source);

var resFile = FSO.OpenTextFile(FileNameTmp, 2, 1);

//выявляем методы и свойства объектов в коде и меняем их синтаксическое написание так: asd.e() -&gt; asd[&quot;e&quot;]()
// сохраняем это в промежуточном файле.
resFile.Write(Replacer(tmp));
resFile.Close();

// запускаем GoogleClosure для обработки временного файла и сохраняем в выходной файл.
WshShell.Run(&quot;%WinDir%\\System32\\java.exe -jar \&quot;&quot;+GetScriptDir()+&quot;compiler.jar\&quot; --js \&quot;&quot;+FileNameTmp+&quot;\&quot; --formatting=pretty_print  --compilation_level ADVANCED_OPTIMIZATIONS --use_only_custom_externs --use_types_for_optimization --js_output_file \&quot;&quot;+FileNameOut+&quot;\&quot;&quot;, 1, 1);
FSO.DeleteFile(FileNameTmp, true)

MsgBox(&quot;Результаты сохранены в файле: &quot; + FileNameOut);
WScript.Quit();

//функция парсинга js. code - текстовый фрагмент, который будет обработан
//парсим js-код, выявляем конструкции языка: регулярные выражения, комментарии, строковые литералы.
//на выходе имеем двухуровневый массив, где элемент - это [[тип_конструкции], [значение]].

function ParseJS(code) {
    var tmp = code, // копия code, которая будет обрабатываться и изменяться в процессе парсинга.  
        found = &quot;&quot;, // строка с найденной начальной конструкцией языка
        startpos = 0,
        result = []; // результирующий массив
    var searchValues = /\/\*\[?|[&quot;&#039;]|\/\/|(?:(^|[;\}\{\(=!\?]|return)\s*)\/(?![\*\/])/m;
    var types = { 
        &#039;/*&#039;: &quot;comment&quot;,
        &#039;/*[&#039;: &quot;resource&quot;,
        &#039;&quot;&#039;: &quot;string&quot;,
        &quot;&#039;&quot;: &quot;string&quot;,
        &#039;//&#039;: &quot;comment&quot;,
        &quot;/&quot;: &quot;regexp&quot;
    }; // типы конструкций языка


// находим точку начала входа в конструкцию
    function getStartPointOfValues(m) {
        
        var t=0;
        found = m;
        var pos = arguments[arguments.length-2];
               
        if (/[^\/]\/$/.test(m)) {
            found = &quot;/&quot;; t=m.length-1;
        }
        
        result.push([&quot;code&quot;, tmp.slice(0,pos+t)]);
        alert(tmp.slice(0,pos));
        
        tmp = tmp.slice(pos + m.length);
    }

// находим точку окончания конструкции языка
    function getEndPointOfValues(m) {
        var pos = arguments[arguments.length-2];
        var content = tmp.slice(0, pos);
        
        result.push([types[found], found+tmp.slice(0,pos + m.length)]);
        tmp = tmp.slice(pos + m.length);
    }

// функция перебора кода
    function findValues() {
        tmp.replace(searchValues, getStartPointOfValues);

        if (found == &#039;&quot;&#039;) tmp.replace(/(?:^&quot;|(?:\\\\|[^\\])&quot;)/, getEndPointOfValues);
        if (found == &quot;&#039;&quot;) tmp.replace(/(?:^&#039;|(?:\\\\|[^\\])&#039;)/, getEndPointOfValues);
        if (found == &#039;//&#039;) tmp.replace(/[\r\n]/, getEndPointOfValues);
        if (found == &#039;/*&#039; || found == &#039;/*[&#039;) tmp.replace(/\*\//, getEndPointOfValues);
        if (found == &quot;/&quot;) tmp.replace(/(?!\\).\//, getEndPointOfValues);
        found = &quot;&quot;;
        return tmp;
    }

    //Перебираем содержание.
    while (tmp != findValues()) {}
    result.push([&quot;code&quot;,tmp]);
    tmp = &quot;&quot;;
    return result;
}


function Replacer(strct)
{
    var result=[];
    
    for (var i=0, l=strct.length; i&lt;l; i++)
    {
        if (strct[i][0] == &quot;code&quot;) result.push(strct[i][1].replace(/\.\s*([\$_a-z0-9]+)/ig, &#039;[&quot;$1&quot;]&#039;));
        else result.push(strct[i][1]);
    }
    return result.join(&quot;&quot;);
}
</code></pre></div><p>На здоровье!</p><p>Что касается предложения с множеством тематических файлов (например, string.js, array.js и т.п.) для облегчения разработки, то оно скоро будет реализовано. Постараюсь использовать гитхаб (увы, не привык). А вообще, пора уже добить проект :-)</p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Sun, 12 Oct 2014 12:36:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=87264#p87264</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=81273#p81273</link>
			<description><![CDATA[<p><strong>dab00</strong>, в точку :-). Это и есть третий этап.</p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Fri, 28 Mar 2014 05:21:36 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=81273#p81273</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=81271#p81271</link>
			<description><![CDATA[<div class="quotebox"><cite>JSman пишет:</cite><blockquote><p>Не смотря на большую занятость, разработка мелкими шажками продолжается</p></blockquote></div><p>Хочу познакомить с одной интересной находкой - <a href="https://github.com/google/traceur-compiler">Traceur</a>. <br />Если правильно понял - пишем на ES6 - компилируем в ES3. По-моему в тему. Сорри, пока сам не пробовал.</p>]]></description>
			<author><![CDATA[null@example.com (dab00)]]></author>
			<pubDate>Fri, 28 Mar 2014 03:37:53 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=81271#p81271</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=81269#p81269</link>
			<description><![CDATA[<p>Обновил первый пост. Не смотря на большую занятость, разработка мелкими шажками продолжается. Код на HTA полностью функционирует.</p><p>Первый этап скоро добью. Осталось порядка 50-60 функций, но это пустяки. Затем, покажу реализацию отброса неиспользуемых функций, чтобы результирующий код был как можно компактнее и проще.</p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Thu, 27 Mar 2014 19:49:52 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=81269#p81269</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=77394#p77394</link>
			<description><![CDATA[<p><strong>im2002</strong>, покажите код. Я проверил, все работает.</p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Mon, 18 Nov 2013 08:24:52 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=77394#p77394</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=77391#p77391</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>поиск с заданной позиции:<br /></p><div class="codebox"><pre><code>
x = [&#039;a&#039;, &#039;b&#039;, &#039;c&#039;, &#039;a&#039;, &#039;b&#039;]
x.indexOf(&#039;b&#039;) // == 1
x.indexOf(&#039;b&#039;, 2) // == 4
</code></pre></div><p>Можно реализовать поиск всех вхождений заданного элемента.</p></blockquote></div><p> Дык не работает же... о том и пишу....</p>]]></description>
			<author><![CDATA[null@example.com (im2002)]]></author>
			<pubDate>Mon, 18 Nov 2013 06:54:41 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=77391#p77391</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=77390#p77390</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Зачем тогда параметр i?</p></blockquote></div><p>поиск с заданной позиции:<br /></p><div class="codebox"><pre><code>
x = [&#039;a&#039;, &#039;b&#039;, &#039;c&#039;, &#039;a&#039;, &#039;b&#039;]
x.indexOf(&#039;b&#039;) // == 1
x.indexOf(&#039;b&#039;, 2) // == 4
</code></pre></div><p>Можно реализовать поиск всех вхождений заданного элемента.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Mon, 18 Nov 2013 06:46:27 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=77390#p77390</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=77389#p77389</link>
			<description><![CDATA[<p>Как эта ф-я работает/должна работать?<br /></p><div class="codebox"><pre><code>// Add ECMA262-5 Array methods if not supported natively
//
if (!(&#039;indexOf&#039; in Array.prototype)) {
    Array.prototype.indexOf= function(find, i /*opt*/) {
        if (i===undefined) i= 0;
        if (i&lt;0) i+= this.length;
        if (i&lt;0) i= 0;
        for (var n= this.length; i&lt;n; i++)
            if (i in this &amp;&amp; this[i]===find)
                return i;
        return -1;
    };
}</code></pre></div><p>даже, если заменить знак &quot;&lt;&quot; на &quot;&gt;&quot; в последнем if , то она всегда будет возвращать индекс элемента массива<br />начиная с 0. Зачем тогда параметр i?</p><div class="codebox"><pre><code>var myArr = [&quot;aaa&quot;, &quot;bbb&quot;, &quot;ccc&quot;];
myArr.indexOf(&#039;ccc&#039;, 0);             // вернёт 2
myArr.indexOf(&#039;ccc&#039;, 1);             // вернёт также 2...</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (im2002)]]></author>
			<pubDate>Mon, 18 Nov 2013 06:36:32 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=77389#p77389</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=77370#p77370</link>
			<description><![CDATA[<p>В общем, довольно интересно почитать рассуждения. Конечно, всем не угодишь. У каждого опыт разный. Я несколько загрузился по теме &quot;что же является базовым фреймворком&quot;. Рассуждения привели к следующему. </p><p>С одной стороны, говорят необходимо разбить на модули все функции, которые связаны с массивами, строками, числами, файловой системой. На самом же деле, следуя такой логике, должен появиться отдельный файл работы с реестром (что сводится по сути к 5 функциям), работы с вебом http (опять же до 5 функций), работа с процессами (3-4 функции) и т.п. А к чему это приведет?</p><p>Код разработчика, который работает с файловой системой, интернетом, а также мапит массив, обязан включить следующий код:<br /></p><div class="codebox"><pre><code>
var AR = include(&quot;array.js&quot;);
var FS = include(&quot;filesystem.js&quot;);
var Inet = include(&quot;http.js&quot;);
</code></pre></div><p>То есть, по такой логике, я должен досконально знать какая именно функция находится в каждом файле фреймворка. Зачем нам такая модульность?</p><p>Окей, продолжу рассуждение. Функций же полно? А языки разные. Как делить будем? Придется либо в коде каждой тематической библы помечать из какого языка функция, либо создавать модуль типа &lt;Язык_программирования&gt;.&lt;Модуль&gt;. Каждый файл опять же надо будет изучать разработчику. Сколько инклудов будет в коде разработчика? Тьма. Запутаемся все. Основных функций для разработчика вполне достаточно не более 100. </p><p>Так что же все-таки можно назвать базовой частью фреймворка? <br />Базовая часть фреймворка, то бишь его основа — это те функции, которые нужны в первую очередь разработчику. А это означает, что разработчику нужно работать и со строками, с массивами, файловой системой, интернетом и т.п. Значит основной модуль должен это все включить в себя. </p><p>Рассмотрим псевдо-код (на базе разрабатываемого фреймворка), который является решением <a href="http://forum.script-coding.com/viewtopic.php?id=8897">этой темы</a>:<br /></p><div class="codebox"><pre><code>
FileCopy( FileFind(&quot;%USERPROFILE%&quot;, /\.mab$/), &quot;\\\\server\\mab\\name.mab&quot;);
</code></pre></div><p>а если вообще пофантазировать, то получится такое:<br /></p><div class="codebox"><pre><code>
FileCopy( FileFind(&quot;%USERPROFILE%&quot;, /\.mab$/), @&quot;\\server\mab\name.mab&quot;);
</code></pre></div><p>Не правда ли просто? И таких примеров решений на форуме можно привести полным-полно. Даже с инклудами играть не хочется.</p><p>Я понимаю, если, допустим, кто-то захочет реализовать работу с облаком Яндекс.Диск, Google Drive, FTP. Вот тогда - да. Модуль определенно нужен. Потому что модуль не должен у разработчика отбирать &quot;основной&quot; функционал, он преподносит ему дополнительный/изолированный функционал.</p><p>Что касается псевдо типов, то по мне это все надуманно. Кому реально нужны integer, float? Каков смысл? Но научить typeof отличать объект от array необходимо.</p><p>Далее, что касается sprintf. <strong>Rumata</strong>, идеологически я предпочитаю оба варианта. Неиспользуемое все равно при обработке будет выпилено. Не бойтесь избыточности.</p><p>В общем, подведу маленький итог своих рассуждений. То, что написано в первом топике, а также в секции To Do - это будет базовым фреймворком, плюс кое-что еще. Трансляторы языков — об этом рано говорить. Взять тот же perl. Реально под него все с нуля надо будет писать. Что поделаешь. </p><p>У меня вопрос к разработчикам. Хорошо, ну вот поделим сейчас базовую часть на string.js, array.js, fs.js, process.js, base.js. Что дальше будет? Сразу начнем программировать? :-D</p><p>UPD: Обновил.<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p>StringCompare Compares two strings with options.<br />StringInStr Checks if a string contains a given substring.<br />StringIsAlNum Checks if a string contains only alphanumeric characters.<br />StringIsAlpha Checks if a string contains only alphabetic characters.<br />StringIsASCII Checks if a string contains only ASCII characters in the range 0x00 - 0x7f (0 - 127).<br />StringIsDigit Checks if a string contains only digit (0-9) characters.<br />StringIsFloat Checks if a string is a floating point number.<br />StringIsInt Checks if a string is an integer.<br />StringIsLower Checks if a string contains only lowercase characters.<br />StringIsSpace Checks if a string contains only whitespace characters.<br />StringIsUpper Checks if a string contains only uppercase characters.<br />StringIsXDigit Checks if a string contains only hexadecimal digit (0-9, A-F) characters.<br />StringLeft Returns a number of characters from the left-hand side of a string.<br />StringLen Returns the number of characters in a string.<br />StringLower Converts a string to lowercase.<br />StringMid Extracts a number of characters from a string.<br />StringRight Returns a number of characters from the right-hand side of a string.<br />StringStripCR Removes all carriage return values ( Chr(13) ) from a string.<br />StringStripWS Strips the white space in a string.<br />StringTrimLeft Trims a number of characters from the left hand side of a string.<br />StringTrimRight Trims a number of characters from the right hand side of a string.<br />StringUpper Converts a string to uppercase. Asc Returns the ASCII code of a character.</p></div></div>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Sat, 16 Nov 2013 18:22:47 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=77370#p77370</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=77365#p77365</link>
			<description><![CDATA[<p><strong>greg zakharov</strong><br /></p><div class="quotebox"><blockquote><p>Ну хорошо, а смысл плодить псевдотипы?</p></blockquote></div><p>Я то лично противник этого. Но речь шла именно о </p><div class="quotebox"><cite>greg zakharov пишет:</cite><blockquote><p>определить самостоятельно целочисленный тип в JavaScript более, чем возможно, правда есть несколько нюансов, например, как идентифицировать Integer без приведения к таковому с помощью parseInt?</p></blockquote></div><p>Поэтому я и привел то решение. Кому надо - тот воспользуется и напишет свою реализацию определения целого числа. </p><div class="quotebox"><blockquote><p>идея классов мной уже выдвигалась, однако была отвергнута, поэтому еще раз повторюсь - давайте с уважением отнесемся к мнению автора темы.</p></blockquote></div><p>Ни в коей мере не отвергаю мнение ни автора (JSMan в данном случае), ни чье-либо другое (Ваше). Речь только о разделении единого файла на этапе разработки на неколько отдельных файлов. Которые проще сопровождать и проще использовать отдельно. </p><div class="quotebox"><blockquote><p>Фреймворк в данном случае по сути является оберткой над встроенными средствами языка, реализующим функции AutoIt</p></blockquote></div><p>Так ли необходимо реализовывать функционал одного языка в другом с точностью до API? Не лучше ли использовать другой язык? Например, в своей работе я использую очень часть Perl и JScript. Будучи на win-машине, использую js, если мне достаточно его средств, либо перехожу на Perl, если решение на нем быстрее проще в реализации и сопровождении. Тем более если это сиюминутная задача, то я возьму Perl (иногда JS, потому что мне не нравится работа с временем в Perl). Но я не создаю фреймфорк perl2js. <br />Но это только мое мнение. Каждый язык имеет свои средства работы с существующими объектами. дублирование классного средства одного языка в другом должно быть органично в рамках данного языка. Например, есть несколько реализаций C-подобной функции sprintf в js. Можно использовать существующее готовое, можно переписать с нуля. Задача стоит в API - как использовать функцию: sprintf(&quot;форматирующая строка&quot;, аргументы) или &quot;форматирующая строка&quot;.sprintf(аргументы). В данном случае оба варианта хороши, но второй - более js-подобный. <br />Автор же волен решать свои задачи, если они ему необходимы. Тем более если в массах они найдут отклик.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sat, 16 Nov 2013 15:00:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=77365#p77365</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=77364#p77364</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>...хак, но изящный...</p></blockquote></div><p>Ну хорошо, а смысл плодить псевдотипы? Вот скажите, на JavaScript написано немало кода, но при этом никто не жаловался на отсутсвие целочисленных типов со знаком или без оного, - смысл ныне браться за перераспределение типов? Игры со смещением таковыми и останутся, если они неприменимы на практике, а на практике, еще раз повторю, никто не заморачивается отсутсвием некоторых типов в JavaScript. Саму же идею можно вполне взять на карандаш.<br /></p><div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Согласен с Вами. Но ограниченный набор отдельных файлов, каждый из которых содержит определенный, ограниченный функционал, лучше, чем один сплошной файл. Если есть зависимости (фнукционал файла А зависит от некотрых функций файла Б)&nbsp; - задокументировать в шапке файла.</p></blockquote></div><p>Простите, но идея классов мной уже выдвигалась, однако была отвергнута, поэтому еще раз повторюсь - давайте с уважением отнесемся к мнению автора темы.<br /></p><div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Думаю, что не стоит приближать один язык к другому.</p></blockquote></div><p>Увы, но каждый из языков что-то наследует от предшественников. Фреймворк в данном случае по сути является оберткой над встроенными средствами языка, реализующим функции AutoIt, в виду чего, а также<br /></p><div class="quotebox"><cite>Serge Yolkin пишет:</cite><blockquote><p>Остальные, как Ruby, например, можно отдать на откуп энтузиастам...</p></blockquote></div><p>могу лишь заметить, что уже полгода как работаю над реализацией интерпретатора Ruby на JavaScript, - именно интерпретатора, а не реализацией функций языка на JavaScript.</p>]]></description>
			<author><![CDATA[null@example.com (greg zakharov)]]></author>
			<pubDate>Sat, 16 Nov 2013 14:27:18 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=77364#p77364</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Фреймворк]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=77362#p77362</link>
			<description><![CDATA[<div class="quotebox"><cite>dab00 пишет:</cite><blockquote><p>Наверное подразумевали Number.prototype.</p></blockquote></div><p>Точно. Это у меня опечатка. </p><div class="quotebox"><cite>greg zakharov пишет:</cite><blockquote><p>Диапазон знакового целочисленного типа, насколько помню, лежит в пределах от -2147483648 до 2147483647, и если попытаться определить тип этих значений с помощью оператора typeof, получим Number. Следовательно, определить самостоятельно целочисленный тип в JavaScript более, чем возможно, правда есть несколько нюансов, например, как идентифицировать Integer без приведения к таковому с помощью parseInt?</p></blockquote></div><p>В этом плане (если действительно есть такая необходимость - определение целочисленности) есть интересный ход, хак, но изящный<br /></p><div class="codebox"><pre><code>
var x = Math.PI;
alert(x &gt;&gt;&gt; 0);
alert(x &gt;&gt; 0);
alert(x &lt;&lt; 0);
alert(x ^ 0);
alert(x | 0);
</code></pre></div><p>Вcе они а) отбрасывают дробную часть числа, б) обнуляют результат, если число по модулю превышает 0xFFFFFFFF (2^32-1), Но здесь есть одна тонкость: числа больше 0x7FFFFFFF можно рассматривать как отрицательные так и положительные. Например, 0x80000001: <br /></p><div class="codebox"><pre><code>
0x80000001 &gt;&gt;  0 == -2147483647
0x80000001 &gt;&gt;&gt; 0 == 2147483649
</code></pre></div><p>Справедливо и обратное: <br /></p><div class="codebox"><pre><code>
-1 &gt;&gt;  0 == -1
-1 &gt;&gt;&gt; 0 == 4294967295
</code></pre></div><p>Иногда может потребоваться одно, иногда - другое. </p><div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>...&quot;валить&quot; в все в одну кучу - не есть хорошо.</p></blockquote></div><div class="quotebox"><cite>greg zakharov пишет:</cite><blockquote><p>Позвольте заметить, что конечное слово все же за разработчиком. Единственное, на что действительно стоит обратить внимание в данном случае - доступность документации.</p></blockquote></div><p>Согласен с Вами. Но ограниченный набор отдельных файлов, каждый из которых содержит определенный, ограниченный функционал, лучше, чем один сплошной файл. Если есть зависимости (фнукционал файла А зависит от некотрых функций файла Б)&nbsp; - задокументировать в шапке файла. </p><p>Так любой сможет с легкостью использовать часть функционала не вытягивая всю библиотеку (например, если кому-то захочется использовать &quot;массивные&quot; функции forEach, map и прочие в реализации JSMan, то он, кто-то легко разберется, что искомое находится в файле Array.js). </p><div class="quotebox"><cite>Serge Yolkin пишет:</cite><blockquote><p>...не загоняясь по синтаксису других языков. Таким образом, ForEach и each из разных фреймворков-трансляторов могут ссылаться на один и тот же код базового фреймворка.</p></blockquote></div><p>Для меня здесь ключевая фраза - &quot;не загоняясь по синтаксису других языков&quot;. Думаю, что не стоит приближать один язык к другому. JS от этого лучше не станет, если он будет похожим на AutoIt. Если кто-то желает програмировать на JS, похожем на AutoIt, может быть он выбрал не тот язык для программирования? В частности, для меня Ruby далек, так же как Cobol, поэтому первые ассоциации при виде each связаны с jQuery, в котором он реализован через абы как - передача параметров прямо противоположна стандартному forEach. Вот пример (об чем думал Джон?):<br /></p><div class="codebox"><pre><code>
var x = [1, 2, 3];
$.each(x, function(index, value) { alert(value); });

x.forEach(function(value, index) { alert(value); });
</code></pre></div><div class="quotebox"><cite>JSman пишет:</cite><blockquote><p>что есть &quot;базовый&quot; js-фреймворк?:) Это сборище функций, которое я сам придумаю?.</p></blockquote></div><p>Согласен полностью. Фактически, фреймворк - это некий набор готовых утилит, методов, оторые упрощают разработку. В теме уже несколько раз упоминался Closure, поэтому разделение на файлы весьма логично, коли лишнее будет удалятся автоматически на этапе сборки.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sat, 16 Nov 2013 13:57:15 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=77362#p77362</guid>
		</item>
	</channel>
</rss>
