Подтвердить что ты не робот

Эта функция языка уже существует?

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

Позвольте мне объяснить эту функцию по объяснению, а затем по определению:

x = a U b;

Где x - переменная, а a и b - другие переменные (или статические значения). Это работает как объединение между a и b; нет дубликатов и никакого конкретного порядка.

with(x) {
    // regular 'with' usage; using the global interpretation of "x"
    x = 5;
    // effectively will do:
    // x = a U b U 5;
    // a = 5;
    // b = 5;
    // Thus, when "a" or "b" changes, "x" is still equal to "5".
}
with(x = a) {
    // this code block is executed when the "x" variable
    // has the "a" variable assigned. All references in
    // this code-block to "x" are references to "a". So saying:
    x = 5;
    // would only change the variable "a". If the variable "a"
    // later on changes, x still equals to 5, in this fashion:
    // 'x = a U b U 5;'
    // '[currentscope] = 5;'
    // thus, 'a = 5;'
}
with(x = b) {
    // same but with "b"
}
with(x != a) {
    // here the "x" variable refers to any variable
    // but "a"; thus saying
    x = 5;
    // is equal to the rewriting of
    // 'x = a U b U 5;'
    // 'b = 5;' (since it was the scope of this block)
}
with(x = (a U b)) {
    // guaranteed that "x" is 'a U b'; interacting with "x"
    // will interact with both "a" and "b".
    x = 5;
    // makes both "a" and "b" equal to 5; also the "x" variable
    // is updated to contain:
    // 'x = a U b U 5;'
    // '[currentscope] = 5;'
    // 'a U b = 5;'
    // and thus: 'a = 5; b = 5;'.
}
// etc.

В приведенном выше примере все кодовые блоки выполняются, но "область" изменяется в каждом блоке, как интерпретируется x. В первом блоке x гарантируется a: таким образом взаимодействуя с x внутри этого блока, будет взаимодействовать на a. Второй и третий кодовые блоки только равны в этой ситуации (потому что not a: тогда остается только b). Последний блок гарантирует, что x не менее a или b.

Далее; U не является "побитовым или оператором", но я назвал его "и/или" -оператором. Его определение:

"U" = "and" U "or"

(В моем блоге http://cplang.wordpress.com/2009/12/19/binop-and-or/ имеется более (математическая) справочная информация об этом операторе. Она свободно основана на наборах. другой синтаксис, изменил его в этом вопросе.)

Обновление: больше примеров.

print = "Hello world!" U "How are you?"; // this will print
                                         // both values, but the
                                         // order doesn't matter.
// 'userkey' is a variable containing a key.
with(userkey = "a") {
    print = userkey; // will only print "a".
}
with(userkey = ("shift" U "a")) {
    // pressed both "shift" and the "a" key.
    print = userkey; // will "print" shift and "a", even
                     // if the user also pressed "ctrl":
                     // the interpretation of "userkey" is changed,
                     // such that it only contains the matched cases.
}
with((userkey = "shift") U (userkey = "a")) {
    // same as if-statement above this one, showing the distributivity.
}

x = 5 U 6 U 7;
y = x + x; // will be:
// y = (5 U 6 U 7) + (5 U 6 U 7)
//   = 10 U 11 U 12 U 13 U 14

somewantedkey = "ctrl" U "alt" U "space"
with(userkey = somewantedkey) {
    // must match all elements of "somewantedkey"
    // (distributed the Boolean equals operated)
    // thus only executed when all the defined keys are pressed
}
with(somewantedkey = userkey) {
    // matches only one of the provided "somewantedkey"
    // thus when only "space" is pressed, this block is executed.
}

Update2: больше примеров и еще некоторый контекст.

with(x = (a U b)) {
    // this
}
// can be written as
with((x = a) U (x = b)) {
    // this: changing the variable like
    x = 5;
    // will be rewritten as:
    // a = 5 and b = 5
}

Некоторая справочная информация: Я строю язык, который является "независимым от времени", например, Java является "независимым от платформы". Все, что указано на этом языке, является "как есть" и постоянно активно выполняется. Это означает; программист не знает, в каком порядке (если явно не указано использование конструкций) элементы не выполняются, ни когда выполняются инструкции. Язык полностью отделен от "времени" -концепции, т.е. Он непрерывно выполняется:

with(true) {
    a = 0; // only runs once (lazy execution)
}

with(a < 5) {
    a++;
} // this is a loop-structure;
  // how and when it executed isn't known however.

with(a) {
    // everytime the "a" variable changes, this code-block is executed.
    with(true) {
        b = 3; // only 5 times (again lazy execution, but it a sub-with)
    }
    with(b < 2) { // dependent on "b"
        // runs only 3 times * 5 times = 15 times.
    }
    with(b > 1) { // dependent on "b"
        b = b - 1; // runs 4 times * 5 times = 20 times.
    }
}

Обновление 3:

После размышления над типом этой языковой функции; он очень похож на платформу Netbeans Platform Lookup, где каждое "с" -условием является синхронизированный агент, работая над ним особым "фильтром" объектов. Вместо основанного на типе, это основано на переменных (принципиально совершенно одинаковое, просто другой способ идентификации объектов).

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

Я не знаю, существует ли эта конструкция, так что мой вопрос: эта функция языка уже существует?

4b9b3361

Ответ 1

Я честно считаю, что ваше объяснение и примеры трудно поддаются (обновление: ваш блог намного лучше и читает Statement Ordering a > там я еще больше убежден, что вы нацелены на форму программирования потока данных).

Однако ваше окончательное описание:

Все, что указано на этом языке, "как есть", и постоянно активно казнены. Это означает; программист не знает, в каком порядке (если явно сформулированные с использованием конструкций) элементы, а также когда утверждения казнены. Язык полностью отделенный от "времени", то есть он непрерывно выполняется: говоря, что "a" - "b", а "b" - "a", является простой петлевой структурой, для экземпляр.

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

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

Реактивное программирование и функциональное реактивное программирование, как I понимать их, вариации по одной теме.

Значок с целенаправленной оценкой более ограничен по масштабу (см. это Краткое введение в значок: обратное слежение, подразумеваемое целенаправленными механизм оценки ограничен выражением, в котором оно происходит).

См. также этот вопрос в Stackoverflow: Языки программирования потока данных.

Обновление: Pindatjuh спрашивает в комментариях: "Можете ли вы также прокомментировать, является ли этот язык новой вариацией темы потока данных?". Я так думаю, но вопрос действительно о определениях и так о консенсусе. В недавнем опросе о языках потока данных Достижения в языках программирования потока данных (опубликовано в ACM Computing Surveys, том 36, выпуск 1, март 2004 г.), авторы писали (стр. 10):

Лучший список функций, которые составлять язык потока данных вперед от Акермана [1982] и подтвержденный Уайтигом и Паско [1994] и Wail and Abramson [1995]. Этот список включает в себя следующее:

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

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

Обновление: Я бессознательно пропустил слово "новое" в вашем вопросе "... этот язык является новым изменением...". Это сложная задача: нужно рассмотреть все языки потока данных, изобретенные до сих пор, и тщательно изучить их семантику в деталях, чтобы выявить новинку в вашем подходе. В настоящее время у меня наверняка нет необходимых знаний.

Ответ 2

Мне сложно это понять, но вы имеете в виду:

x == a | b 

будет синтаксическим сахаром, эквивалентным:

(x == a) || (x == b)

В сообщении в блоге вы приводите этот пример:

1 + (2|3)

Таким образом, тип этого выражения представляет собой пару целых чисел со значениями 3 и 4, каждая из которых представляет одно из возможных значений. Поэтому мы также можем сказать:

4 == (1 + (2|3)
3 == (1 + (2|3)

и оба из них будут оцениваться как true. Таким образом, оператор == может сравнивать значение с видом вектора значений и будет true, если любое из значений в векторе равно первому значению.

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

Разве это не так же, как объединение двух множеств, а с == интерпретируется как "является членом"? И такие операторы, как +, поднимаются, поэтому они применяются ко всем членам набора.

И если вы сделали (1 | 2) + (4 | 8), вы получили бы эквивалент (5 | 9 | 6 | 10), потому что это четыре возможных результата.

Хорошо, из дополнительных примеров, которые вы добавили, я вижу, что == фактически требует, чтобы левая и правая стороны были тем же самым набором, а не просто перекрывались. Но у меня все еще создается впечатление, что ваш | является просто объединением двух множеств. То, что это влечет за собой (или означает), будет зависеть от того, что вы делаете со всеми другими функциями вашего языка для работы с наборами.

Относительно вашего утверждения:

Язык полностью разделен из "времени" -концепции

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

Update:

Вы добавили это на свой вопрос:

if(x == a | b) {
    // this 
}
// can be written as
if((x == a) | (x == b)) {
    // this
}
// which can be written as
if(x == a) {
    // this
}
if(x == b) {
    // with this
}

Интересно, как вы думаете, что будет освещать!

Дело в том, что первые две версии имеют один блок кода под if. Поэтому, если третья расширенная версия имеет два блока, они должны быть одного и того же блока. Другими словами, это еще один способ написания:

if (x == a || x == b) {
    // this
}

Где || является традиционным булевым OR. Это именно тот вопрос, который я впервые задал.

Хорошо, еще раз... Теперь вы изменили синтаксис, указав, что вы делаете союзы и перекрестки. Но тогда:

if(userkey I ("shift" U "a")) {
    // pressed both "shift" and the "a" key.

Итак, I означает пересечение двух наборов... но if выполняет блок кода при каких обстоятельствах? Если пересечение непустое? Или I на самом деле спрашивает: "все члены набора справа от элементов набора слева". И есть подсказки, что userkey заменяется в области блока на другое значение, которое на самом деле просто установите справа.

Я пойду спать.

Ответ 3

В ваших примерах и вашей математике можно было бы использовать какую-то работу, но, по крайней мере, в одном из примеров вашего блога, использование | очень похоже на использование одного и того же оператора (там я называю "чередование" ) в Язык программирования значков.

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

Ответ 4

У С#, конечно, нет функций, которые вы описываете. То, о чем вы говорите, несколько напоминает Робина Милнера pi calculus; все это касается определения языка для описания параллельных процессов. Вы можете подумать о том, чтобы сделать некоторые исследования в этом, если вы еще этого не сделали.

Ответ 6

Вы должны были придумать свои собственные символы, даже для примера.

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

Не могли бы вы объяснить контекст вождения этого необычного метода? Ссылка на ваш блог не очень полезна. И термин "непрерывное программирование" не определяется и не объясняется.

Update:

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

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

Python и Ruby имеют механизм yield, который очень похож и, возможно, зависит от генераторов значков.

Ответ 7

Советую вам не добавлять эту функцию языка. Программисту было бы непонятно, что значение x изменяется, если вы выполните "тест", например:

if( x != a ) { ... }

Ответ 8

У этого языка есть язык, основанный на Inform IF-authoring. Из DM:

if (alpha == 3 or 4) print "Scott";

На самом деле он не сильно зацепился, хотя он немного странный для разбора (вам нужно связать каждый оператор or/| с конкретным компаратором ==/!=), и в современных языках сценариев легко заменить что-то вроде:

if alpha in (3, 4):
    print 'Scott';

(пример Python.)

Ответ 9

Кажется, вы сразу же выкалываете несколько идей:

  • Синтаксис списка, в котором вы делаете что-то вроде 5 | 6 | 7
  • используя внешний продукт, в котором вы пишете ::list:: + ::list::
  • тщательно определяя значение операторов равенства, неравенства, присваивания и т.д., когда один или оба аргумента являются списком. То есть что ::scalor:: == ::list:: реализует "элемент из" и т.д.

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

Ответ 10

"with" существуют в as3:

private var _a:Number = 0.0;
public function get a():Number{
// Do stuff
    return _a;
}
public function set a(value:Number):void{
// Do stuff
    _a=value;
}