[js] А вот интересно ...
От: c-smile Канада http://terrainformatica.com
Дата: 12.07.09 07:36
Оценка:
есть такой код (JS):

      somevar = 100;

      function test()
      {
        somevar = 1;
        return somevar;
        if(false) { var somevar; }
      }

      alert(test());
      alert(somevar);


(попробуйте предсказать вывод тех alert()ов, ответ для ленивых в конце сообщения)

Как будет себя вести скажем Питон в аналогичном случае?
Мой tiscript например выведет два раза "1".





























"1" и "100"
Re: [js] А вот интересно ...
От: Курилка Россия http://kirya.narod.ru/
Дата: 12.07.09 08:00
Оценка: +2
Здравствуйте, c-smile, Вы писали:

[cut]
CS>Как будет себя вести скажем Питон в аналогичном случае?
CS>"1" и "100"

А чего странного?
Внутри функции в питоне создаётся локальная переменная и её значение возвращается функцией, всё более чем предсказуемо.
Re: [js] А вот интересно ...
От: Курилка Россия http://kirya.narod.ru/
Дата: 12.07.09 08:03
Оценка: 36 (1)
Здравствуйте, c-smile, Вы писали:


Попробуй на питоне вот такое изобразить:

CS>
CS>      somevar = 100;

CS>      function test()
CS>      {
           alert(somevar);
CS>        somevar = 1;
CS>        return somevar;
CS>        if(false) { var somevar; }
CS>      }

CS>      alert(test());
CS>      alert(somevar);
CS>


Получить UnboundLocalError
Re[2]: [js] А вот интересно ...
От: c-smile Канада http://terrainformatica.com
Дата: 12.07.09 08:05
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, c-smile, Вы писали:


К>[cut]

CS>>Как будет себя вести скажем Питон в аналогичном случае?
CS>>"1" и "100"

К>А чего странного?

К>Внутри функции в питоне создаётся локальная переменная и её значение возвращается функцией, всё более чем предсказуемо.

if you will remove this line:

if(false) { var somevar; }


result in JS will be "1" and "1"
Re[3]: [js] А вот интересно ...
От: Курилка Россия http://kirya.narod.ru/
Дата: 12.07.09 08:11
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>if you will remove this line:


CS>
CS>if(false) { var somevar; }
CS>


CS>result in JS will be "1" and "1"


А блин, ты запутал с языками, приводишь код на JS с просьбой дать ответ, результат на tiscript, а вопрос про питон.
Поясни, как ты приведённую строку на питоне напишешь? Или питон был был так просто "до кучи", а претензии к JS?
Re: [js] А вот интересно ...
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 12.07.09 08:35
Оценка: 36 (1) +2
Здравствуйте, c-smile, Вы писали:


CS>есть такой код (JS):


CS>
CS>      somevar = 100;

CS>      function test()
CS>      {
CS>        somevar = 1;
CS>        return somevar;
CS>        if(false) { var somevar; }
CS>      }

CS>      alert(test());
CS>      alert(somevar);
CS>


CS>(попробуйте предсказать вывод тех alert()ов, ответ для ленивых в конце сообщения)


CS>Как будет себя вести скажем Питон в аналогичном случае?


"Аналогичного случая" для Питона не будет, потому что нет аналога двум действиям:
1. Какой-то код после return. За редчайшими исключениями, в Питоне все команды исполняемые.
2. Нет аналога оператору var. Необъявленная ранее переменная вводится имплицитно. Наоборот, для использования внешней переменной надо написать "global var" (если она на уровне модуля).

Поэтому — твой подход просто некорректен, а что ты решил назначить тут "аналогичным случаем" в Питоне — рассказывай сам (просто покажи код). Дальше посмотрим, аналогично это или нет.
The God is real, unless declared integer.
Re[2]: [js] А вот интересно ...
От: c-smile Канада http://terrainformatica.com
Дата: 12.07.09 18:14
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, c-smile, Вы писали:



CS>>есть такой код (JS):


CS>>
CS>>      somevar = 100;

CS>>      function test()
CS>>      {
CS>>        somevar = 1;
CS>>        return somevar;
CS>>        if(false) { var somevar; }
CS>>      }

CS>>      alert(test());
CS>>      alert(somevar);
CS>>


CS>>(попробуйте предсказать вывод тех alert()ов, ответ для ленивых в конце сообщения)


CS>>Как будет себя вести скажем Питон в аналогичном случае?


N>"Аналогичного случая" для Питона не будет, потому что нет аналога двум действиям:

N>1. Какой-то код после return. За редчайшими исключениями, в Питоне все команды исполняемые.

Не понял про "все команды исполняемые"... Можем переписать так

somevar = 100;
function test()
{
   if(true)
   {
     somevar = 1;
     return somevar;
   }
   else { var somevar; } // <<<<<
   return 0;
}


и ничего в плане результатов не изменится.

В JS как и в C/C++ identifier означает либо локальную переменную либо глобальную.
Проблема состоит в том что 1) все имена/перменные внутри функции попадают в один общий namespace и 2)
если где-то в недрах функции встретилось это имя с приставкой var то оно меняет суть *всех*
обращений к somevar втсретившихся и после и самое неприятное — до.

Такое решение представляется
1) конкретной засадой. Где-то в глубине функции кто-то напишет безобидный { var somevar; } и все — концов не найдешь в коде до него.
2) Означает что строго говоря прямая интерпретация JS невозможна — только через компиляцию и/или построение AST.

N>2. Нет аналога оператору var. Необъявленная ранее переменная вводится имплицитно. Наоборот, для использования внешней переменной надо написать "global var" (если она на уровне модуля).


А скажем такое сработает:

nlist = 100

def test():
    nlist = 1
    global nlist
    return nlist


?
Re: [js] А вот интересно ...
От: Mr.Cat  
Дата: 12.07.09 18:35
Оценка: 54 (1) +1
Здравствуйте, c-smile, Вы писали:
CS>Как будет себя вести скажем Питон в аналогичном случае?

С питоном все немножко наоборот. Там нет декларации локальности, но есть декларация глобальности. и ведет она себя одинаково для:
Python 2.6.2 (r262:71600, Jun  6 2009, 22:14:54) 
[GCC 4.4.0 20090526 (prerelease)] on linux2
[code]
и

Python 3.1 (r31:73572, Jul 1 2009, 12:22:02)
[GCC 4.4.0 20090526 (prerelease)] on linux2
[/code]
somevar = 100

def test():
    somevar = 1
    return somevar
    if False:
        global somevar
        pass

print(test())
print(somevar)

1.py:7: SyntaxWarning: name 'somevar' is assigned to before global declaration
  global somevar
1
1

somevar = 100

def test():
    somevar = 1
    return somevar
    if False:
        #global somevar
        pass

print(test())
print(somevar)

1
100


















CS>"1" и "100"
Re[2]: [js] А вот интересно ...
От: c-smile Канада http://terrainformatica.com
Дата: 12.07.09 19:47
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

Чего-то я не въеду в смысл этого warning:

1.py:7: SyntaxWarning: name 'somevar' is assigned to before global declaration
global somevar


На какой точно строке это появляется?
Re: [js] А вот интересно ...
От: z00n  
Дата: 12.07.09 20:00
Оценка: 46 (2)
Здравствуйте, c-smile, Вы писали:
CS>есть такой код (JS):
CS>
CS>      somevar = 100;

CS>      function test()
CS>      {
CS>        somevar = 1;
CS>        return somevar;
CS>        if(false) { var somevar; }
CS>      }

CS>      alert(test());
CS>      alert(somevar);
CS>


CS>(попробуйте предсказать вывод тех alert()ов, ответ для ленивых в конце сообщения)


CS>Как будет себя вести скажем Питон в аналогичном случае?

CS>Мой tiscript например выведет два раза "1".

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

somevar = 100;

 function test()
 {
   somevar = 1;
   return somevar;
   (function(){
     if(false) { var somevar; }
   })();
 }



JavaScript: The Good Parts By Douglas Crockford:
...
JavaScript's syntax comes from C. In all other C-like languages, a block (a set of statements wrapped in curly braces) creates a scope. Variables declared in a block are not visible outside of the block. JavaScript uses the block syntax, but does not provide block scope: a variable declared in a block is visible everywhere in the function containing the block. This can be surprising to programmers with experience in other languages.

In most languages, it is generally best to declare variables at the site of first use. That turns out to be a bad practice in JavaScript because it does not have block scope. It is better to declare all variables at the top of each function.

Re[3]: [js] А вот интересно ...
От: Курилка Россия http://kirya.narod.ru/
Дата: 12.07.09 20:04
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Mr.Cat, Вы писали:


CS>Чего-то я не въеду в смысл этого warning:


CS>

CS>1.py:7: SyntaxWarning: name 'somevar' is assigned to before global declaration
CS>global somevar


CS>На какой точно строке это появляется?


там же написано — на седьмой, т.е. где глобальную переменную объявляешь.
Re[3]: [js] А вот интересно ...
От: Mr.Cat  
Дата: 12.07.09 20:09
Оценка:
Здравствуйте, c-smile, Вы писали:
CS>На какой точно строке это появляется?
В самом начале, до начала выполнения скрипта.
print (-1)
somevar = 100
print (0)
def test():
    print (2)
    somevar = 50
    print (3)
    return somevar
    if False:
        global somevar
        pass

print (1)
print(test())
print (4)
print(somevar)
print (5)

1.py:10: SyntaxWarning: name 'somevar' is assigned to before global declaration
  global somevar
-1
0
1
2
3
50
4
50
5
Re[3]: [js] А вот интересно ...
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 12.07.09 20:25
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>А скажем такое сработает:


CS>
CS>nlist = 100

CS>def test():
CS>    nlist = 1
CS>    global nlist
CS>    return nlist

CS>


CS>?


Нет, не проходит компиляцию. Если бы проходило — было бы точно так же, как Вы описываете для JS. Указать как global нужно до первого использования.
The God is real, unless declared integer.
Re[2]: [js] А вот интересно ...
От: meandr  
Дата: 12.07.09 20:31
Оценка:
Re: [js] А вот интересно ...>>JS печально известен своим идиотским правилом, что у него один scope на тело функции. Второго такого >>языка, возможно и нет. Починить это можно так (я как то переписывал код с JS и долго не мог понять >>зачем это нужно):

Ну какбы всякие Python, php тоже с таким вот идиотским правилом
Posted via RSDN NNTP Server 2.1 beta
Re[3]: [js] А вот интересно ...
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 12.07.09 20:50
Оценка:
Здравствуйте, meandr, Вы писали:

M>Re: [js] А вот интересно ...>>JS печально известен своим идиотским правилом, что у него один scope на тело функции. Второго такого >>языка, возможно и нет. Починить это можно так (я как то переписывал код с JS и долго не мог понять >>зачем это нужно):


M>Ну какбы всякие Python, php тоже с таким вот идиотским правилом:-))


Угу — по сравнению с ними Perl с его my выглядит значительно приятнее (я уж не вспоминаю, что local играет роль ещё и try-finally для замены переменной или элемента хэша). Питоновый вариант по сравнению с ним сильно урезан и крив. С другой стороны, само требование явно объявить необходимость доступа к внешней переменной через global является хорошей защитой от глупых ошибок...
The God is real, unless declared integer.
Re[4]: [js] А вот интересно ...
От: meandr  
Дата: 12.07.09 20:54
Оценка:
Re[3]: [js] А вот интересно ...
Perl потихоничку отмирает, с сожалению
Posted via RSDN NNTP Server 2.1 beta
Re[4]: [js] А вот интересно ...
От: c-smile Канада http://terrainformatica.com
Дата: 13.07.09 02:37
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, c-smile, Вы писали:


CS>>А скажем такое сработает:


CS>>
CS>>nlist = 100

CS>>def test():
CS>>    nlist = 1
CS>>    global nlist
CS>>    return nlist

CS>>


CS>>?


N>Нет, не проходит компиляцию. Если бы проходило — было бы точно так же, как Вы описываете для JS. Указать как global нужно до первого использования.


А если в какой субблок засунуть?

Ну типа:

def test():
    nlist = 1
    if true:
      global nlist
      return nlist


(Не уверен за правильность нотации, извиняюсь, но мысль должна быть понятна)

Т.е. есть ли у Python block scopes? Или тоже все внавал лежит?
Re[2]: [js] А вот интересно ...
От: anonymous Россия http://denis.ibaev.name/
Дата: 13.07.09 07:39
Оценка:
Здравствуйте, z00n, Вы писали:

Z>JS печально известен своим идиотским правилом, что у него один scope на тело функции.


Почему идиотским?
Re: [js] А вот интересно ...
От: anonymous Россия http://denis.ibaev.name/
Дата: 13.07.09 07:46
Оценка: +1
Здравствуйте, c-smile, Вы писали:

CS>Мой tiscript например выведет два раза "1".

CS>"1" и "100"

ECMA-262, 3я редакция, раздел 12.2:

Блок не определяет новой области выполнения. Только Программа и ОбъявлениеФункции создают новую область видимости.

Re[2]: [js] А вот интересно ...
От: Mamut Швеция http://dmitriid.com
Дата: 13.07.09 11:06
Оценка: +1
Здравствуйте, anonymous, Вы писали:

a> CS>Мой tiscript например выведет два раза "1".

a> CS>"1" и "100"

a> ECMA-262, 3я редакция, раздел 12.2:

a>

a> Блок не определяет новой области выполнения. Только Программа и ОбъявлениеФункции создают новую область видимости.


Но тогда описаное поведение жутко неявное. Получается, что локальность переменной определена только в конце функции, да еще после return'а...
avalon 1.0rc1 rev 239, zlib 1.2.3


dmitriid.comGitHubLinkedIn
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.