Принятие динамической области видимости переменных - PullRequest
1 голос
/ 29 сентября 2010

Представьте, что вы разрабатываете свой собственный язык программирования.Очень простой язык для довольно конкретной цели.У него есть функции, циклы и переменные.И вы хотите использовать динамическое определение объема для переменных.

Рассмотрите воображаемый пример:

var x = "foo"
var count = 0

loop (/* condition */) {

    var x = "bar"
    // A new stack frame is created for 'x',
    // so inside the loop (and any subsequent function calls) it is bound to "bar",
    // but outside the loop 'x' is still bound to "foo"

    print (x) // output is "bar"

    var count = count + 1
}

print (x) // output is "foo"
print (count) // desired output is something above zero, but it's not !!!

Мой вопрос - как сделать значение переменной countустановить внутри цикла, чтобы быть видимым снаружи?Как бы вы это сделали, чтобы это выглядело более естественным (или менее запутанным) для пользователей?

  • Не могли бы вы ввести специальное ключевое слово, чтобы присвоить значение существующей переменной из внешней области в дополнение кключевое слово для определения новой переменной в текущей области?Скажем, set и var , или assing и def и т. Д. Но что тогда будет означать «внешний охват»?Что, если 'count' не определен непосредственно перед циклом, а вместо этого он определен ранее где-нибудь в стеке вызовов?Будет ли "set count = ..." присвоить значение переменной от этого родителя родителя родительского фрейма?
  • Не могли бы вы ввести возвращаемое значение (или кортеж) в оператор цикла, чтобыможно написать что-то вроде:

    var count = 0 var count = loop (условие == true) возвращает [i] {var i = i + 1}

Разве это не выглядит неловко?

  • Ваше решение?

Насколько известно, Perl поддерживает динамическую область видимости, используя ключевое слово local .Как бы вы реализовали такой пример в Perl, используя динамические переменные области * только 1036 * ?

Спасибо!

1 Ответ

0 голосов
/ 29 сентября 2010

Звучит так, будто ты хочешь съесть свой торт и съесть его здесь. Некоторые переменные, объявленные во внутренней области видимости, должны «скрывать» идентичные переменные во внешней области видимости, в то время как другие не должны.

Звучит довольно легко для меня; если переменная объявлена ​​во внутренней области видимости с идентичной сигнатурой (имя и тип), как и во внешней области видимости, компилятор должен разрешить этот «синтаксический сахар» и просто создать новую переменную, на которую фактически ссылается какое-то гибридное приложение в любом промежуточном коде используется (MSIL, JIL, сборка). Затем удалите объявление var из count, и большинство стандартов, касающихся области действия внутри метода, сделают эту работу именно так, как вы хотите. При желании вы можете потребовать использования ключевого слова «new» в объявлении внутренней переменной, чтобы подтвердить компилятору, что вы действительно хотите переменную с тем же именем, которая «скрывает» определение внешней области видимости. Таким образом, ваш фрагмент будет меняться только следующим образом:

var x = "foo";
var count = 0;

loop (/* condition */) {

    var x = "bar"; //"hides" the outer x; maybe require "new" to confirm

    print (x); // "bar"

    count = count + 1; //works with the outer definition of count
}

print (x); // "foo"
print (count); // > 0
...