Si tiene cierres, ¿puedo suponer que puedo utilizar muchas de las técnicas de estilo funcional fuertes allí?¿Tiene Smalltalk cierres?
Respuesta
Sí, Smalltalk tiene cierres. El siguiente código crea un cierre que devuelve la suma de sus dos argumentos:
sum := [ :a :b | a + b ].
Los cierres son objetos que se pueden crear instancias, pasan alrededor y manipulados. Para evaluar un cierre que envíe value
, value:
, value:value:
, ...
sum value: 1 value: 2.
Los cierres se utilizan prominentemente con las colecciones de ITERATE filtro, mapas, ... todos los valores de una colección:
aCollection select: [ :each | each isOdd ].
aCollection inject: 0 into: [ :each :result | each + result ].
Además, se utilizan para las estructuras de control como bucles:
[ iterator hasNext ]
whileTrue: [ iterator next ].
1 to: 10 do: [ :each | ... ].
también condicionales se implementan utilizando cierres:
condition
ifTrue: [ do this ]
ifFalse: [ do that ]
Pharo ellos tiene:
todas las máquinas virtuales tienen el apoyo de cierre necesaria para últimas imágenes
makeAdder := [ :x | [ :y | x + y ]].
add2 := makeAdder value: 2.
add2 value: 3.
Devoluciones 5
.
notar que
makeCounter := [ :init | [ init := init + 1. init ]].
no va a funcionar (Cannot store into ->init …
), como (por ejemplo) en la CL:
CL-USER> ((lambda (init) (lambda() (incf init))) 0)
#<COMPILED-LEXICAL-CLOSURE #xC7A495E>
CL-USER> (funcall *)
1
CL-USER> (funcall **)
2
CL-USER> (funcall ***)
3
Si no me equivoco, esto solía trabajar antes de la Se introdujo un nuevo compilador de cierre. No estoy seguro de por qué no funciona con el nuevo compilador.
Los argumentos de bloque y método son de solo lectura en Smalltalk. Sin embargo, algunos compiladores antiguos no revisaron correctamente las escrituras de argumentos en bloque. –
Gracias por la aclaración, Lukas! – danlei
Pero puede usar un bloque de temperatura local, así: makeCounter: = [: init | | contar | count: = init. [count: = count + 1. count]]. (valor de valor de contador: 3); valor –
- 1. ¿Qué tiene de especial los cierres?
- 2. ¿Qué es un cierre? ¿Java tiene cierres?
- 3. bloques Smalltalk en Objective-c?
- 4. Cierres en Scala vs Cierres en Java
- 5. ¿Comenzarías a aprender Smalltalk?
- 6. ¿Cuál es la diferencia de ANSI Smalltalk y Smalltalk-80?
- 7. Javascript Cierres
- 8. ¿Tenemos cierres en C++?
- 9. Analizando RDF en Smalltalk
- 10. Responsabilidad individual en smalltalk
- 11. smalltalk error handling
- 12. Any Smalltalk en .NET?
- 13. Smalltalk y IoC
- 14. Cadena para enterrar Smalltalk
- 15. Actividad actual de desarrollo Smalltalk
- 16. ¿Cómo maneja Smalltalk con monkeypatching?
- 17. Cierres en Ruby
- 18. malentendido de JavaScript cierres
- 19. Cierres (en Haskell)
- 20. Aplicación parcial y cierres
- 21. cierres léxicos sobre macrolet?
- 22. Cierres en Java 7
- 23. cierres Scala en Wikipedia
- 24. Cierres y cuantificación universal
- 25. Invocación Groovy cierres
- 26. Cierres y tareas
- 27. cierres y objetos
- 28. Cierres en Python
- 29. ¿Cierres y alcance dinámico?
- 30. ¿Diferencias entre Smalltalk y python?
Su primer ejemplo solo toma los parámetros proporcionados por el mensaje 'value: value:', pero su ejemplo de 'whileTrue:' tiene bloques que usan la variable 'iterator' que se define fuera del bloque. ¿Una es una lambda y la otra un cierre, o no hay diferencia en Smalltalk? – quamrana
@quamrana: No hay diferencia (visible). La mayoría de las implementaciones Smalltalk optimizan sus objetos de cierre dependiendo del uso de variables externas. Sin embargo, todos los cierres comprenden los mismos mensajes, por lo que para usted como desarrollador no hay diferencia. –