UTNianos

Versión completa: Orden Superior en Smalltalk
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Preguntonta: ¿Se puede asumir que un método es de orden superior porque recibe un bloque como parámetro?

No se qué contestar en caso de que me pregunten esto en el final, lo primero que pensé es si, pero después pensé, en Smalltalk un bloque es un objeto, no es un mensaje, por ende el método esta recibiendo otro objeto, por más que ese objeto sea código sin ejecutar, entonces no hay orden superior, es un método recibiendo un objeto como parámetro.

am i right?
Un bloque es una funcion?
Técnicamente no es orden superior, aunque creeo que si lo pones en el final te lo aceptan (lo leí en la wiki de pdep si mal no recuerdo). Otra cosa que se puede considerar orden superior es cuando un objeto le manda un mensaje a otro objeto pidiéndole que haga algo que no sea una acción simple (como enviar un dato, por ejemplo). No se si me explico. De todas formas si lo podes justificar creo que te lo tendrían que tomar como bien
Se habla de orden superior cuando manejo a mi programa como si fuera un dato. Osea, antes mis datos eran números, estructuras, objetos, strings, blehs, pero ahora TAMBIÉN puedo manejar como si fuera un dato a una parte de mi programa (una función, un predicado).

En el caso de objetos, la forma de tener comportamiento como un dato es el bloque, sí: tengo un objeto (mi única forma de tener datos) que representa comportamiento (código, programa). Así como en Prolog tengo el call para evaluar predicados, o en funcional puedo aplicar funciones que me pasen como parámetro, en Smalltalk puedo mandarle "value" a un bloque (o sus variaciones "value:" y demás) para "ejecutar" ese cacho'e código que tengo como si fuera un dato.

Si eso no es orden superior, alguien que me lo explique =)
(17-12-2013 15:56)rm1216 escribió: [ -> ]Técnicamente no es orden superior, aunque creeo que si lo pones en el final te lo aceptan (lo leí en la wiki de pdep si mal no recuerdo). Otra cosa que se puede considerar orden superior es cuando un objeto le manda un mensaje a otro objeto pidiéndole que haga algo que no sea una acción simple (como enviar un dato, por ejemplo). No se si me explico. De todas formas si lo podes justificar creo que te lo tendrían que tomar como bien

Gracias, no entendi bien lo último. O sea si yo hago que un objeto me devuelva un resultado que yo voy a usar, es orden superior?
En objetos, hay orden superior siempre. Dicho por mi profesor. Los objetos siempre se usan a si mismos y a los otros objetos, interactuan siempre, entonces hay siempre orden superior.
(17-12-2013 16:27)brianle escribió: [ -> ]En objetos, hay orden superior siempre. Dicho por mi profesor. Los objetos siempre se usan a si mismos y a los otros objetos, interactuan siempre, entonces hay siempre orden superior.

No me cierra mucho eso . objeto <> método, los métodos son de orden superior, no los objetos.
Que los objetos interactuen entre si no debería implicar en sí mismo que haya orden superior, volviendo al concepto, un procedimiento es de orden superior cuando recibe como parámetro otro procedimiento, no una referencia a una estructura de datos (en este caso, un objeto).

O sea esa argumentación se basa en el simple hecho de que a un objeto pasado como parámetro se le puede mandar un mensaje, pero la idea de orden superior seria un mensaje recibiendo otro mensaje, un objeto no es un mensaje... :/


Ahora, yéndonos un poco más afuera del tema del final, estube chusmeando y el concepto de mensaje de orden superior recién fue presentado en 2005, y se implementó en Smalltalk en las LazyCollections. Al menos hasta donde yo busqué, nunca se considera de orden superior a un mensaje que recibe un bloque como parámetro.
Yo contestaría que sí hay orden superior porque se manda "comportamiento" por parámetro.
Igualmente supongo que es de esas preguntas que se fijan mas en la justificación que en la respuesta en sí
Saludos!
Che, ¿por qué no preguntaron en PdeP?
Baron Bomadil la respuesta es . Un bloque de codigo es un objeto particular pero con una lógica dentro. Funciones como ifTrue, ifFalse, detect, etc son FOS (Funciones de Orden Superior) puesto que reciben un bloque de código que resuelve algo concreto con cierta lógica. Sin embargo, un bloque de código con esa lógica interna (también conocido como "cacho de código") pero SIN ser parámetro de algun objeto. Es decir, ESTO -> [.....] value NO ES FOS.

Espero haberte ayudado.

Saludos!!
(18-12-2013 11:43)Desert69 escribió: [ -> ]Che, ¿por qué no preguntaron en PdeP?

Estoy esperando que me aprueben la membresía al grupo =P

(18-12-2013 12:57)reLlene escribió: [ -> ]Baron Bomadil la respuesta es . Un bloque de codigo es un objeto particular pero con una lógica dentro. Funciones como ifTrue, ifFalse, detect, etc son FOS (Funciones de Orden Superior) puesto que reciben un bloque de código que resuelve algo concreto con cierta lógica. Sin embargo, un bloque de código con esa lógica interna (también conocido como "cacho de código") pero SIN ser parámetro de algun objeto. Es decir, ESTO -> [.....] value NO ES FOS.

Espero haberte ayudado.

Saludos!!

Sacando que dijiste funciones en vez de método, supongo que es una justificación correcta.
Al fin y al cabo, parece ser que lo que importa es la justificación, y un mensaje puede ser o no de orden superior (para la cátedra) depende de dónde lo mires.
Igual cuando pueda escribir en el grupo lo hago a ver qué me contestan =P
Saludos!

Off-topic:
(18-12-2013 13:40)Baron Bomadil escribió: [ -> ]
(18-12-2013 11:43)Desert69 escribió: [ -> ]Che, ¿por qué no preguntaron en PdeP?

Estoy esperando que me aprueben la membresía al grupo =P

Si no te aprobamos todavía, mandá de nuevo diciendo con quién cursaste. O mandame un PM, es raro que se me haya escapado =)
(18-12-2013 14:40)Desert69 escribió: [ -> ]
Off-topic:
(18-12-2013 13:40)Baron Bomadil escribió: [ -> ]
(18-12-2013 11:43)Desert69 escribió: [ -> ]Che, ¿por qué no preguntaron en PdeP?

Estoy esperando que me aprueben la membresía al grupo =P

Si no te aprobamos todavía, mandá de nuevo diciendo con quién cursaste. O mandame un PM, es raro que se me haya escapado =)


Off-topic:
Ya me aceptaron y mandé la pregunta al grupo, gracias!
URLs de referencia