В компилятор GCC, воходящий в состав Mac OS X 10.6, была добавлен новый, полезный тип данных – блоки. По поведению и объявлению блоки очень похожи на функции:
blockReturningIntTakingChar = ^int (char arg) { return arg*10; };
int n = blockReturningIntTakingChar(‘a’);
Использование нового типа позволяет упростить код, например, сортировка с использованием блоков будет выглядеть следующим образом:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, const char * argv[]) {
char *strings[4] = { "Masha", "Vasya", "Dima", "Petya" };
qsort_b( strings, 4, sizeof(char*), ^(const void* l, const void *r) {
char *left = *(char**)l;
char *right = *(char**)r;
return strncmp( left, right, 1 );
});
return 0;
}
Apple представил это расширение на рассмотрение рабочей группой по разработке стандарта языка C как
N1370: Apple’s Extensions to C. Хочется надеятся что в скором времени данная фича будет работать не только на Mac OS X.
Здравствуйте, kaa.python, Вы писали:
KP>KP>blockReturningIntTakingChar = ^int (char arg) { return arg*10; };
KP>int n = blockReturningIntTakingChar(‘a’);
KP>
Поубивал бы за то, что они сделали своё расширение для лямбд, когда комитет С++ уже практически стандартизовал лямбды в языке и основные поставщики уже поддержали их
Молодцы — одно слово
От того, что у них единый синтаксис для С, С++ и Objective-C мало кому тепло; а вот от того, что разный синтаксис у разных компиляторов С++ ничего кроме проблем.
Они реализовали
__block переменные*, которых нет в С++0х; но я уверен они могли бы это сделать как расширение для С++0х лямбд, тогда по-крайней мере __block переменные можно было бы просто не использовать, если нужна портируемость.
* __block переменные предоставляют настоящие замыкания. Т.е. если в С++0х передал переменную как [&], но её время жизни не согласовано со временем жизни лямды — сам себе злобный буратино. __block переменные же автоматически будут жить пока живёт лямбда. Т.к. сборки мусора нет, то __block переменная, естественно, просто копируется со стека в динамическую память (насколько я понял, лениво, т.е. только при необходимости).
Здравствуйте, remark, Вы писали:
R>Поубивал бы за то, что они сделали своё расширение для лямбд, когда комитет С++ уже практически стандартизовал лямбды в языке и основные поставщики уже поддержали их
R>Молодцы — одно слово
На мой взгляд молодцы. Ждать когда комитет C++ что-то наконец примет можно еще лет 10, а решением от Эппла можно пользоваться уже сейчас.
R>От того, что у них единый синтаксис для С, С++ и Objective-C мало кому тепло; а вот от того, что разный синтаксис у разных компиляторов С++ ничего кроме проблем.
Почему-же, от этого очень тепло разработчикам под Mac OS X
R>Они реализовали __block переменные*, которых нет в С++0х; но я уверен они могли бы это сделать как расширение для С++0х лямбд, тогда по-крайней мере __block переменные можно было бы просто не использовать, если нужна портируемость.
Я у них не заметил утверждения про то, что C++0x лямбды не будут реализованы, так что ждем C++0x.
Здравствуйте, remark, Вы писали:
R>Поубивал бы за то, что они сделали своё расширение для лямбд, когда комитет С++ уже практически стандартизовал лямбды в языке и основные поставщики уже поддержали их
Строго говоря в терминах C block может быть сущностью которая ближе к goto чем к функциям.
Здравствуйте, kaa.python, Вы писали:
KP>Здравствуйте, remark, Вы писали:
R>>Поубивал бы за то, что они сделали своё расширение для лямбд, когда комитет С++ уже практически стандартизовал лямбды в языке и основные поставщики уже поддержали их
R>>Молодцы — одно слово
KP>На мой взгляд молодцы. Ждать когда комитет C++ что-то наконец примет можно еще лет 10, а решением от Эппла можно пользоваться уже сейчас.
C++0x лямбдами в компиляторах Intel, Microsoft, gcc тоже можно пользоваться уже сейчас; но у них всех плюс ещё и синтаксис одинаковый.
R>>От того, что у них единый синтаксис для С, С++ и Objective-C мало кому тепло; а вот от того, что разный синтаксис у разных компиляторов С++ ничего кроме проблем.
KP>Почему-же, от этого очень тепло разработчикам под Mac OS X
У этих языков столько других отличий, что одинаковые лямбды погоды не делают. Тем более они всё равно работают не совсем одинаково.