LINUX.ORG.RU

javascript, макросы (cpp)


0

1

Можно ли совместно с javascript использовать макросы, например CPP (C preprocessor)? Вопрос как. Понятно, что можно (в частности CPP). Может есть более цивилизованный способ это делать, возможно вместе с компрессором/обфускатором, но я этого не знаю?


может ты почитаешь и куришь как делают в жс а не будешь спрашивать как сделать то что ты делал в школе?

trashymichael ★★★
()

man CGI!

И вообще, сколько можно задавать такие элементарные вопросы? Ну неужели нельзя для начала с матчастью ознакомиться?

Eddy_Em ☆☆☆☆☆
()
$ cat main.js.in
function main() {
#ifdef DEBUG
    alert("Debug is ON!");
#else
    alert("Debug is OFF!");
#endif
}
$ cpp main.js.in -o main.js
$ cat main.js
# 1 "main.js.in"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.js.in"
function main() {



    alert("Debug is OFF!");

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

Накой: 1) #include, 2) собственно макросы вида xxx(yyy).

Без п.1 очень неудобно работать с исходниками.

Без п.2 выкрутиться eval'ом как я понял толком нельзя, всё полумеры и костыли. Типичный пример — как сделать assert()

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

3) нужны предопределённые в момент «сборки» константы. Их конечно можно через #include (см. п. 1), либо через cpp. А иначе непонятно как.

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

Как cpp использовать из makefile понятно, нужен ключик запрещающий line numbers (# 1 blablabla...), кажись -P.

fk0
() автор топика
Ответ на: комментарий от trashymichael

В школе этого я не делал. А как делают в JS? Я умею это делать в других ЯВУ, JS не программировал ранее.

fk0
() автор топика
Ответ на: комментарий от marvin_yorke

Задача: javascript-приложение (web-application) для мобильного телефона. «Онлайн» не обязателен (используется cache manifest). Ключевое слово — «приложение». Как делаются GUI приложения для PC в разных фреймворках я в курсе. Веб ранее не программировал толком.

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

читал наискосок. для инклудов есть что угодно от амд до менеджеров ассетов, для макросов есть, о боже, ты не поверишь, ФУНКЦИИ

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

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

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

Менеджеров-кого? Нужен один большой файл, в котором будет всё. И js, и html, и картинки через data. В этом файле будет необходимый минимум приложения. Остальное дозагружается через ajax.

fk0
() автор топика
Ответ на: комментарий от trashymichael

Проблема функции в том, что её аргументы вычислены уже до её вызова. В отличии от макроса. Макрос вообще работает «на этапе компиляции». Ну и даже если вспоминать об eval, то область видимости у него какая-то не такая как у вызывающей функции. А штуки вроде upvar (как в Tcl) в javascript нет.

fk0
() автор топика

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

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

Нужен один большой файл, в котором будет всё. И js, и html, и картинки через data. В этом файле будет необходимый минимум приложения. Остальное дозагружается через ajax.

Может, стоит все-таки отойти от этих вантузячих привычек?

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

Имел ввиду uplevel (tcl).

И собственно номера строк и имена файлов известны в момент «компиляции», а не исполнения (ибо обфускатор/компрессор). И без макросов assert() не сделать. И вообще вывод сообщений для отладки без макросов получается неудобно. С макросами сразу есть ссылка на имя файла и строку, а без — поди пойми кто это написал и почему.

#if/endif опять же. Бывает нужно. if (0) не всегда вариант. Да и много чего. Можно долго говорить и приводить примеры. Не зря в C/C++ макропроцессор есть, не зря в C++ появились темплейты.

fk0
() автор топика
Ответ на: комментарий от Eddy_Em

Это не вантузячья привычка а жизненная необходимость. Во-первых грузится быстрей, во-вторых нет проблем с тем, что если есть cache manifest и половина файлов обновилась, а половина нет (увы, в современных браузерах не всё тут хорошо).

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

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

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

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

trashymichael ★★★
()

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

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

А штуки вроде upvar (как в Tcl) в javascript нет

А зачем она там? Чтобы по ссылке передавать простые типы? Это зло. А объекты передаются по ссылке.

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

Это не вантузячья привычка а жизненная необходимость. Во-первых грузится быстрей, во-вторых нет проблем с тем, что если есть cache manifest и половина файлов обновилась, а половина нет (увы, в современных браузерах не всё тут хорошо).

Это не ватузячья привычка, это какой-то бред.

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

Макрос вообще работает «на этапе компиляции».

Приведи пример, когда яваскрипту нужно на этапе компиляции выполнить код.

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

Умник, скажи как быть, если у тебя 10 js файлов и половина старой версии, а половина новой. Разумеется не работает.

Ты сам ничего такого не делал, вот и бред с твоей точки зрения.

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

fk0
() автор топика
Ответ на: комментарий от Reaper

<del>upvar</del> uplevel нужна для вытаскивания области видимости более верхней функции в контект текущей. В javascript оно ни к чему, в нём область видимости разделяется со всеми вызывающими функциями (а-ля perl с его local или lisp). На самом деле это нехорошо ибо порождает массу ошибок (в perl не зря разделение на local и my) во-первых, во-вторых тратится много времени на поиск переменной и, собственно, затруднена компиляция в код адресующий по указателю, без всяких переменных (внутри интерпретатора).

Зачем. Затем, что в функции function test(expr) {eval(expr)... } всё что выполняется внутри eval будет выполнено в контекте функции test, а не в контекте вызывающей её функции (как в случае макроса). И метода насильственной связи контекста функции test с контекстом вызывающей функции (uplevel) в javascript нет. Либо я что-то не понимаю, но покажите как написать код:

function  test2() {
  test("var c=5");
  return c;
}

Чтоб вернулось 5, а не undefined.

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

Во-первых грузится быстрей

Меньше соединений к серверу - да. Кстати, нонче браузеры сразу в несколько потоков, емнип, грузят.

во-вторых нет проблем с тем, что если есть cache manifest и половина файлов обновилась, а половина нет

Пиши правильно манифест чё.
Распространена практика кешировать js, css, img, а http-документ каждый раз запрашивать (если, конечно, сайт динамический).

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

как быть, если у тебя 10 js файлов и половина старой версии, а половина новой

После каждого деплоя менять $time в <script src=«/js/script.js?t=$time»></script>.

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

если у тебя 10 js файлов и половина старой версии, а половина новой.

насмешил

> find app -type f -name '*.js' | wc -l
51
> find apps -type f -name '*.js' | wc -l
146
> (find app -type f -name '*.js' -print0 | xargs -0 cat) | wc -l
5801
> (find apps -type f -name '*.js' -print0 | xargs -0 cat) | wc -l
16830

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

как быть, если у тебя 10 js файлов и половина старой версии, а половина новой. Разумеется не работает

У меня деплоится с новыми уникальными именами, но можно и как сказали - уникальный параметр добавить к имени файла.

Reaper ★★
()

Инклуд:

var includeJs = function includeJs (url, onLoad, onError, scope) {
    var script = document.createElement('script'),
        me = this,
        onLoadFn = function() {
            onLoad.call(scope);
        },
        onErrorFn = function() {
            onError.call(scope);
        };

    script.type = 'text/javascript';
    script.src = url + '?_dc=' + new Date().getTime();
    script.onload = onLoadFn;
    script.onerror = onErrorFn;
    script.onreadystatechange = function() {
        if (this.readyState === 'loaded' || this.readyState === 'complete') {
            onLoadFn();
        }
    };

    this.documentHead.appendChild(script);

    return script;
}

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

Но это все только для разруливания зависимостей во время разработки - на продакшн все должно собираться в 1 файл

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

assert нужен не для тестирования, а для вылавливания багов в работающих программов. Варианта тут два. «Непонятно что и непонятно как глючит» или «выдаёт конкретное сообщение об ошибке». Последний вариант явно лучше и позволяет вообще разобраться в ситуации.

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

fk0
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.