Возможно ли метапрограммирование в Javascript?

во время моей рутинной работы я случайно написал цепную функцию javascript, которая является чем-то вроде выражения LINQ для запроса результата JSON.

var Result = from(obj1).as("x").where("x.id=5").groupby("x.status").having(count("x.status") > 5).select("x.status");

Он отлично работает и дает ожидаемый результат.

мне было интересно, что это выглядит потрясающе, если код написан так (более читаемым способом)

var Result = from obj1 as x where x.status
groupby x.status having count(x.status)  > 5
select x.status;

есть ли способ достичь этого??

Ура

Рамеш Вэл

8 ответов


нет. JavaScript не поддерживает это.

но это тоже выглядит неплохо:

var Result =  from(obj1)
             .as("x")
             .where("x.id=5")
             .groupby("x.status")
             .having(count("x.status") > 5)
             .select("x.status");

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

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

Если у вас есть система преобразования программы общего назначения, которая может анализировать произвольные языки, вы можете делать метапрограммирование на/с любым языком, который вам нравится. Смотрите наш программное обеспечение DMS реинжиниринга инструментарий для такого инструмента, который имеет надежные интерфейсы для C, C++, Java, C#, COBOL, PHP и ECMAScript и ряда других языков программирования и используется для метапрограммирования на всех эти.

в вашем случае вы хотите расширить грамматику JavaScript новым синтаксисом для SQL-запросов, а затем преобразовать их в простой JavaScript. (Это очень похоже на преднамеренное Программирование) DMS легко позволит вам создать диалект JavaScript с дополнительными правилами, а затем вы можете использовать его возможности преобразования программы для создания эквивалентного стандартного Javascript.

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

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


хотя это не совсем то, что вы хотели, можно написать синтаксические анализаторы в javascript и просто проанализировать запрос (сохраненный как строки), а затем выполнить его. например, использование библиотек типаhttp://jscc.jmksf.com/ (Без сомнения, есть и другие) это не должно быть слишком сложно реализовать.

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


Ну, в вашем примере кода:

var Result = from(obj1)
            .as("x")
            .where("x.id=5")
            .groupby("x.status")
            .having(count("x.status") > 5)
            .select("x.status");

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

            .having(function(x){ return x.status > 5; })

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


в чистом JS нет вы не можете. Но с правильным препроцессором это возможно.

вы можете сделать что-то подобное с сладкий.js макросы или (да простит меня Бог)GPP.


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

начиная с ECMAScript 6, метапрограммирование теперь поддерживается в некотором смысле через символ, отражает и Прокси объекты.

осуществив поиск в Интернете, я нашел несколько очень интересных статей на эту тему, написанная Кейт Киркель:

метапрограммирование в ES6: символы и почему они потрясающие!--4-->

короче говоря, символы-это новые примитивы, которые могут быть добавлены внутри объекта (практически не являясь свойствами) и очень удобны для передачи ему свойств метапрограммирования. Символы - это изменение поведения существующих классов путем их изменения (отражение в реализации).

метапрограммирование в ES6: Часть 2-отражение

вкратце, отражает эффектно собрание всего из те "внутренние методы", которые были доступны исключительно через внутренние компоненты JavaScript engine, теперь представлены в одном удобном объекте. Его использование аналогично возможностям отражения Java и C#. Они используются для обнаружения информации очень низкого уровня о вашем коде (отражение через интроспекцию).

метапрограммирование в ES6: Часть 3-Прокси

короче говоря, прокси-это объекты-обработчики, отвечающие за обертывание объектов и перехват их поведение через ловушки (отражение через ходатайство).

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

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


Wat вы хотите изменить синтаксический анализатор javascript на синтаксический анализатор SQL. Он не был создан для этого, синтаксис JavaScript не позволяют.

У вас есть 90%, как SQL (он отображает прямо на него), и 100% действительный javascript, что является большим достижением. Мой ответ на вопрос в заголовке: да, метапрограммирование возможно, но нет, оно не даст вам синтаксический анализатор SQL, поскольку оно обязательно будет использовать грамматику javascript.


может быть, вы хотите что-то вроде помощью jsonpath Если у вас есть данные JSON. Я нашел это в http://www.json.org/. Множество других инструментов, связанных с оттуда, если это не совсем то, что вам нужно.

(Это прорабатывается также: http://docs.dojocampus.org/dojox/json/query)