Небольшая задача на Пайтоне

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

(lambda x:x(x))(lambda z: lambda y:z)(1)(2)(3)

Добавлено позднее: если кому-то проще JavaScript, вот тот же код на JavaScript 1.8:

(function (x) x(x))(function (z) function (y) z)(1)(2)(3)

Комментарии 16

Artemy Tregubenko (arty.name) № 1
то же самое на яваскрипте, для тех, кто больше привык к нему, как я:

(function(x) {
return x(x)
})(function(z){
return function(y) {
return z;
}
})(1)(2)(3)

я вначале решил, что это нечто вроде y combinator, но потом оказалось просто
Евгений Степанищев (bolknote.ru) автор № 2
Лучше уж на JavaScript 1.8, ближе к оригиналу:
Artemy Tregubenko (arty.name) № 3
я как раз хотел ближе к привычному коду, который я понимаю ; )
с питоновскими лямбдами я не справился, а когда переписал в знакомом виде, всё получилось
chun lu № 7
вот это загиб. признаюсь честно, немного подумав, сдался, запустил код. но это не помогло нисколько)))
в принципе, самая сложная часть--понять, в какой последовательности идёт запуск функций
Евгений Степанищев (bolknote.ru) автор № 8
самая сложная часть — понять, в какой последовательности идёт запуск функций

Понять легко, мне было сложно сначала удержать в памяти несколько объектов, потом справился :)

blog.denyamsk.ru № 10
Легко решилось, когда возвращаемые функции я обозначил в уме как f1, f2… а потом уже при вызовах разворачивал обратно :)
А так — путаешься.
indeec17 № 13
оптимизировал и переписал то же самое на php:
echo 2;
Евгений Степанищев (bolknote.ru) автор № 14
На PHP сейчас тоже есть полноценные анонимные функции, так что «переписал» не считается, но оптимизировано хорошо :)