netch80: (Default)
[personal profile] netch80

Кто с ходу увидит ошибку?

    for i in range(0,3):                                                    
        test.acct_servers[i].handleAcctRequest = \                          
                lambda p: handleAcctRequest(test, test.acct_servers[i], p)  

Получившие данную шишку на лбу понимают, почему для порождения замыкания надо рисовать отдельную функцию.

UPD[2012-07-05]: от gegmopo4:
... lambda p, i=i: (далее по тексту)
Работает, но я не берусь отправлять такое в общее репо.

Date: 2012-07-04 12:01 pm (UTC)
From: [identity profile] netch80.livejournal.com
А в чём разница?

Date: 2012-07-04 12:03 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Захватывается слепок энвайромента или сам энвайромент.
В первом случае всё должно работать правильно, во втором вообще не понятно что будет с i после ухода из скоупа цикла. Ну, то есть, язык с GC, ясно что будет — у всех оно получится 3.

Date: 2012-07-04 12:58 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
В Питоне нет «скоупа цикла». И у всех получится 2.

Date: 2012-07-04 01:00 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Почему два, когда цикл (0,3)? Или там математическая запись — не включая концов?

Date: 2012-07-04 01:04 pm (UTC)
From: [identity profile] p1r4nh4.livejournal.com
range(3) == [0, 1, 2]

Date: 2012-07-04 01:05 pm (UTC)
From: [identity profile] p1r4nh4.livejournal.com
А, там range(0, 3) - ну это то же самое фактически (0 - дефолтный там).

Date: 2012-07-04 01:29 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Очень интуитивно, ага. Я бы понял, если бы (0,3) было бы 1 и 2 (ну, в целых числах), в [0,3] — 0, 1, 2 и 3. А так — вообще бред. Это же range()! Почему у него один конец включён, а второй — нет?

Date: 2012-07-04 01:31 pm (UTC)
From: [identity profile] p1r4nh4.livejournal.com
Потому что range(3) - это ряд из 3 элементов. А генерировать ряд, не включая 0 - неудобно жить будет. Поэтому [0, 1, 2].

Когда пишут фор в си-подобных языках, тоже пишут (i = 0; i < 10; i++), а не i <= 9. Всë ок, так удобно жить.

Date: 2012-07-04 01:32 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Я, кстати, по-разному пишу, зависит от реальных границ. Например, от 0 до 0x7f я напишу с равенством а не строгое неравенство до 0x80.
Не знаю, почему.

Date: 2012-07-04 01:34 pm (UTC)
From: [identity profile] p1r4nh4.livejournal.com
Ну, я б сказал, что мне так было бы проще понять - всë-таки 16-ричная система счисления не настолько привычна, как 10-ричная, с ней меньше общаешься в жизни.

Date: 2012-07-04 01:50 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Удобно, если элементы массива нумеровать с 1.

Date: 2012-07-04 01:52 pm (UTC)
From: [identity profile] p1r4nh4.livejournal.com
Это вызывает кучу других неудобств. Я с Луа уже достаточно повозился, чтоб меня это начало раздражать. :)

Date: 2012-07-04 02:23 pm (UTC)
From: [identity profile] p1r4nh4.livejournal.com
Хотя бы потому, что ломается то, о чëм рассказывал Дейкстра: http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

Если мы начинаем с 0, то индекс меньше длины. А если с 1, то меньше или равен - и начинают вылезать ошибки на 1 в разных местах. :(

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

Это надо сказать, что в Луа с ними проще, чем там в жс или в си - есть итераторы типа pairs/ipairs, которые вернут что надо, иначе бы циклы довольно стрëмно выглядели.

Date: 2012-07-05 08:27 am (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Не пойму, что там у Дейкстры ломается, кроме привычки.

Date: 2012-07-04 07:28 pm (UTC)
From: [identity profile] dottedmag.livejournal.com
Потому что операции над открытыми и закрытыми интервалами гораздо сложнее, чем над полуоткрытыми:

[a,a) ==> empty
[a,b) [b,c) ==> [a,c)
[a,b) [c, d) ==> [b, c)
(следствие) [a,b) [b,c) ==> empty
(следствие) a <= b <= c ==> [a,c) = [a, b) [b, c), при этом <= в левой части существенно.

С открытыми и закрытыми появляются граничные случаи в количествах.

Date: 2012-07-04 07:30 pm (UTC)
From: [identity profile] dottedmag.livejournal.com
Жыжы съел тэги.

[a,b) union [b,c) => [a,c)
[a,b) intersect [c,d) => [b,c)
[a,b) intersect [b,c) => empty
a <= b <= c ==> [a, c) = [a,b) union [b,c)

Date: 2012-07-04 01:13 pm (UTC)
From: [identity profile] p1r4nh4.livejournal.com
Да, кстати, в новом джаваскрипте (harmony) ввели блочный скоупинг (let вместо var), и там при таких раскладах всë будет хорошо:

let lambas = [];
for (let i = 0; i < 10; i++) {
lambdas.push(function() { console.log(i); });
}

Это будет работать как хочется.

Profile

netch80: (Default)
netch80

January 2026

S M T W T F S
    1 23
45678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 2nd, 2026 02:17 pm
Powered by Dreamwidth Studios