varias superponer studio modificar lineas graficos graficas ejes objective-c functional-programming lambda

objective-c - studio - superponer graficas en r



Cómo escribir métodos lambda en Objective-C? (3)

El concepto de lambda en Objective-C ahora está encapsulado con la idea de Blocks que son el equivalente de funciones de paso por referencia. Por supuesto, podría decirse que uno ya tenía en C la idea de indicadores de función; los bloques son solo una forma de capturar también el estado local (es decir, pueden ser cierres). De hecho, los bloques también se pueden usar en otros lenguajes C también (en Mac): hay una propuesta para hacerlos parte de la sintaxis C estándar.

Aquí hay un ejemplo de definir una lambda para multiplicar dos números juntos:

int (^mult)(int, int) = ^(int a, int b) { return a*b; };

La primera parte declara una variable, de tipo ^int(int,int) y luego la asigna a la expresión lambda (aka block) que devuelve el múltiplo de sus dos argumentos. Luego puede pasar ese fn, definirlo en otros lugares, etc. incluso puedes usarlo en otras funciones.

Aquí hay un ejemplo de definición de una función, que cuando se invoca, devuelve otra función:

multiplyBy = ^(int a) { return ^(int b) { return b*a; }; }; triple = multiplyBy(3);

Tenga en cuenta que puede mezclar bloques con tipos de objetos (generalmente usando id como el tipo de objeto) y muchas de las nuevas estructuras de datos de objeto Objective-C tienen algún tipo de operación de nivel de bloque. GCD también usa bloques para pasar eventos arbitrarios; sin embargo, tenga en cuenta que GCD también puede usarse con punteros a funciones.

Cómo escribir métodos lambda en Objective-C?


Escuché a André Pang en NSConference hablar sobre cómo se iban a introducir los bloques con la próxima versión de Objective-C.

Esto debería permitir la programación funcional.

Editar: Desde que se lanzó Snow Leopard, este es realmente el caso. Objective-C ahora tiene Blocks .


OS X 10.6 introdujo bloques. Vea la respuesta de AlBlue para ejemplos .

Si no está usando Snow Leopard, puede obtener algo parecido a la composición de la función usando otras funciones.

Ejemplo usando punteros de función C:

void sayHello() { NSLog(@"Hello!"); } void doSomethingTwice(void (*something)(void)) { something(); something(); } int main(void) { doSomethingTwice(sayHello); return 0; }

Ejemplo usando el patrón de comando:

@protocol Command <NSObject> - (void) doSomething; @end @interface SayHello : NSObject <Command> { } @end @implementation SayHello - (void) doSomething { NSLog(@"Hello!"); } @end void doSomethingTwice(id<Command> command) { [command doSomething]; [command doSomething]; } int main(void) { SayHello* sayHello = [[SayHello alloc] init]; doSomethingTwice(sayHello); [sayHello release]; return 0; }

Ejemplo usando un selector:

@interface SaySomething : NSObject { } - (void) sayHello; @end @implementation SaySomething - (void) sayHello { NSLog(@"Hello!"); } @end void doSomethingTwice(id<NSObject> obj, SEL selector) { [obj performSelector:selector]; [obj performSelector:selector]; } int main(void) { SaySomething* saySomething = [[SaySomething alloc] init]; doSomethingTwice(saySomething, @selector(sayHello)); [saySomething release]; return 0; }