Что такое точно метапрограммирование?

Это потому, что вы объявили i variable as int и вы принимаете ввод как string, поэтому, когда он проверяет условие, он получает значение null в i variable и не может войти, если проверка блока ниже кода

]
    #include <stdio.h>

    int main(){

      int i;
        printf("Value to check Interval \n");
        scanf("%d",&i);

      if (i>4 && i<6){
        printf("%d Value is in first interval\n", i);
      }
    }

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

110
задан nbro 26 September 2016 в 11:37
поделиться

6 ответов

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

На языках как C#, отражение является формой метапрограммирования, так как программа может исследовать информацию о себе. Например, возвращая список всех свойств объекта.

На языках как ActionScript, можно оценить функции во времени выполнения для создания новых программ, таких как оценка ("x" +, i).DoSomething () влиял бы на объект, названный x1, когда мне 1 год и x2, когда мне 2 года.

Наконец, другая стандартная форма метапрограммирования - когда программа может изменить себя нетривиальными способами. LISP известен за это и является чем-то, что Paul Graham защитил приблизительно десятилетие назад. Я должен буду искать некоторые его определенные эссе. Но идея состоит в том, что программа изменила бы другую часть программы на основе ее состояния. Это позволяет уровню гибкости принимать решения во времени выполнения, которое очень трудно на большинстве популярных языков сегодня.

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

Из эссе Paul Graham , "Что Сделанный Lisp, Отличающийся" :

Много языков имеют что-то позвонившее макрос. Но макросы Lisp уникальны. И хотите верьте, хотите нет, то, что они делают, связано с круглыми скобками. Разработчики Lisp не помещали все те круглые скобки в язык только, чтобы отличаться. Программисту Плача код Lisp выглядит странным. Но те круглые скобки там по причине. Они - исходящее доказательство принципиального различия между Lisp и другими языками.

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

, Если Вы понимаете, как компиляторы работают, что действительно продолжается, не так много, что Lisp имеет странный синтаксис как, что Lisp не имеет никакого синтаксиса. Вы пишете программы в деревьях синтаксического анализа, которые сгенерированы в рамках компилятора, когда другие языки анализируются. Но эти деревья синтаксического анализа полностью доступны для Ваших программ. Можно записать программы, которые управляют ими. В Lisp эти программы называют макросами. Они - программы та запись программы.

Программы та запись программы? Когда Вы когда-либо хотели бы сделать это? Не очень часто, если Вы думаете в Коболе. Все время, если Вы думаете в Lisp. Было бы удобно здесь, если я мог бы дать пример мощного макроса и сказать там! как насчет этого? Но если бы я сделал, то было бы просто похоже на мусор кому-то, кто не знал Lisp; нет комнаты здесь для объяснения всего, что необходимо было бы знать для понимания то, что это означало. В язык Common LISP Ansi я пытался переместить вещи вперед с такой скоростью, как я мог, и несмотря на это я не добирался до макросов до страницы 160.

, Но я думаю, что могу дать своего рода аргумент, который мог бы быть убедительным. Исходный код редактора Viaweb был, вероятно, приблизительно 20-25%-ми макросами. Макросы более трудно записать, чем обычные функции Lisp, и они считали плохим стилем для использования их, когда они не необходимы. Таким образом, каждый макрос в том коде там, потому что это должно быть. То, что это означает, - то, что по крайней мере 20-25% кода в этой программе делают вещи, которые Вы не можете легко сделать ни на каком другом языке. Однако скептически настроенный программист Плача мог бы быть о моих требованиях о таинственных полномочиях Lisp, это должно сделать его любопытным. Мы не писали этот код для нашего собственного развлечения. Мы были крошечным запуском, программируя настолько трудно, как мы могли для помещения технических барьеров между нами и нашими конкурентами.

А подозрительный человек мог бы начать задаваться вопросом, была ли некоторая корреляция здесь. Большой блок нашего кода делал вещи, которые очень трудно сделать на других языках. Получающееся программное обеспечение сделало вещи, которые не могло сделать программное обеспечение наших конкурентов. Возможно, было некоторое соединение. Я поощряю Вас следовать за тем потоком. Может быть больше тому старику, хромающему вперед на его костылях, чем кажется на первый взгляд.

79
ответ дан Matthew Murdoch 24 November 2019 в 03:15
поделиться

Ну, метапрограммирование просто программирует, но это в основном "написание кода, которое пишет код" .

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

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

Статические типизированные языки также имеют мощные методы метапрограммирования, например, C++ шаблонное метапрограммирование ...

28
ответ дан CMS 24 November 2019 в 03:15
поделиться

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

я думаю, что это включает:

  1. генерация кода Компиляции или генерация кода Во время выполнения (или оба)
  2. Аспектно-ориентированные Взгляды или Аспектно-ориентированное программирование
  3. DRY, Думая

я думаю, что можно добраться там при помощи любого из них и в комбинации:

  1. Отражение
  2. DSLs (Предметно-ориентированные языки)
  3. Атрибуты (.NET) или Аннотации (Java)
  4. Дженерики (.NET/Java)
  5. Шаблоны (C++)
  6. method_missing (Ruby)
  7. закрытия / первый класс функционирует / делегаты
  8. AOP - Аспектно-ориентированное программирование
11
ответ дан Jamal 24 November 2019 в 03:15
поделиться

Metaprogramming пишет программу который выводы другая программа. Это - что-то, в чем языки как Lisp действительно хороши. Намного легче сделать на языке, который поддерживает реальные макросы (не макросы C++, а скорее, которые могут управлять кодом, который они производят), такие как Ruby, Lisp, Схема, и т.д., чем на языке как Java.

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

, Если Вы заинтересовали исследованием этого метода, проверьте Структура и Интерпретация Компьютерных программ , который является одной из основополагающих книг, касающихся предмета.

6
ответ дан Steve Rowe 24 November 2019 в 03:15
поделиться

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

В основном, это - написание кода, что выводы больше кода, который выполняется для выполнения некоторой цели. Это обычно делается любой в том же языке (использующий JavaScript, чтобы создать строку JavaScript, затем eval это) или испустить другой язык (использующий.NET для создания пакетного файла окон).

4
ответ дан EndangeredMassa 24 November 2019 в 03:15
поделиться

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

4
ответ дан Mr Fooz 24 November 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: