?

Log in

No account? Create an account
Про lambda в python - Журнал Витуса. — LiveJournal
[Друзья] [Свежие записи] [Dreamwidth] [Фото] [Тексты] [Друзья Ирины] [Матерные писатели] [Сообщества] [3 круг]
January 21st, 2010
09:14 pm
[User Picture]

[Link]

Previous Entry Share Next Entry
Про lambda в python

(76 comments)

Comments
 
[User Picture]
From:vitus_wagner
Date:January 21st, 2010 07:41 pm (UTC)
(Link)
Ну в общем, похоже. Если бы в C можно было разместить функцию в динамической памяти - malloc-ом.

То есть это функция, тело которой существует только постольку, поскольку мы где-то храним или куда-то передаем на нее ссылку. (учитываем, что у нас язык с garbage collection, и как только у нас исчезла последняя ссылка на объект, он из памяти удалился).

(Replies frozen) (Parent) (Thread)
From:karpion
Date:January 21st, 2010 07:47 pm (UTC)
(Link)
А как код оказывается в памяти? Чем заполняется область при malloc()?
(Replies frozen) (Parent) (Thread)
[User Picture]
From:vitus_wagner
Date:January 21st, 2010 07:53 pm (UTC)
(Link)
Ну у нас же на самом деле не C.

Вот соответственно, в теле оператора lambda и написан тот самый код, который нужно скомпилировать во внутреннее представление (байткод) и ссылку на него вернуть. Потом она будет передана куда-то в качестве параметра или чему-то присвоена.
(Replies frozen) (Parent) (Thread)
From:karpion
Date:January 21st, 2010 08:07 pm (UTC)
(Link)
А разве оно компилится не перед началом выполнения?
(Replies frozen) (Parent) (Thread)
[User Picture]
From:tzirechnoy
Date:January 21st, 2010 09:40 pm (UTC)
(Link)
Это неважно, как она компилится. В некоторых вариантах лиспа она при возможности компилится при компилянии программы. В некоторых других вариантах лиспа она всегда интэрпретируется из обычного списка из атомов, строк и подсписков в памяти, точно такого жэ, которым являются аргументы любого вызова функцыи в этом лиспе. Несмотря на это работают они одинаково.
(Replies frozen) (Parent) (Thread)
[User Picture]
From:taris_marh
Date:January 22nd, 2010 04:41 am (UTC)
(Link)
Вот интересно, а насколько реально сделать какой-нибудь достаточно тупой компилятор C/C++, без всяких там особых оптимизаций, и приделать его к стандартному набору библиотек, чтобы лепить с его помощью такие вот анонимные функции? Это будет хоть сколько-нибудь эффективно? Или слишком много компиляция съест и проще приделывать интерпретатор скриптового языка?
(Replies frozen) (Parent) (Thread)
[User Picture]
From:yurikhan
Date:January 22nd, 2010 05:19 am (UTC)
(Link)
В стандарте C++0x будут лямбды. В GCC вроде бы уже branch есть с поддержкой.
(Replies frozen) (Parent) (Thread)
(Deleted comment)
[User Picture]
From:kouzdra
Date:January 25th, 2010 05:44 pm (UTC)
(Link)
Анонимные как раз прикручиваются просто - в GCC вложенные функции, имеющие доступ к локальной среде (и даже могущие выходить в нее по метке сбрасывая стек) есть. Превращение их в анонимные - вопрос исключительно синтаксической правки.

Сборка мусора для этого не нужна (все здесь обсужденные применения они покрывают)

Вот функции высших порядков без gc работать не будут
(Replies frozen) (Parent) (Thread)
(Deleted comment)
[User Picture]
From:kouzdra
Date:January 25th, 2010 08:39 pm (UTC)
(Link)
Почему же - по моему А-68 опыту - вещь исключительно удобная. Да и все здешние примеры ими покрываются.
(Replies frozen) (Parent) (Thread)
[User Picture]
From:gegmopo4
Date:January 23rd, 2010 07:53 am (UTC)
(Link)
Тупой компилятор C++ даже без оптимизаций — чертовски сложная штука. С pure C попроще, но нафига козе баян (она и так весёлая)?
(Replies frozen) (Parent) (Thread)
[User Picture]
From:kouzdra
Date:January 24th, 2010 10:12 pm (UTC)
(Link)
Кстати, для этих-то примеров gc совершенно не нужен - вполне хватит просто анонимных функций, даже ссылка на фрейм тут не нужна.

А уж варианта из A-68 (proc (int x, int y) int: x*y ) который может ссылаться на переменные (но не валиден за пределами их области действия - вместо замыкания просто в значение засовывается ссылка на объемлющий стековый фрейм) хватит с запасом.
(Replies frozen) (Parent) (Thread)
My Website Powered by LiveJournal.com