GNU Smalltalk es una implementación del lenguaje de programación Smalltalk por el Proyecto GNU .
Autor (es) original (es) | Steve Byrne, Paolo Bonzini |
---|---|
Versión inicial | 12 de enero de 2003 |
Lanzamiento estable | 3.2.5 / 11 de abril de 2013 |
Repositorio | |
Sistema operativo | Unix ( Linux , Cygwin , Mac OS X / Darwin ) |
Tipo | Lenguaje de programación |
Licencia | GPL + LGPL |
Sitio web | https://www.gnu.org/software/smalltalk/ |
La implementación, a diferencia de otros entornos de Smalltalk, utiliza archivos de texto para la entrada del programa e interpreta el contenido como código de Smalltalk. De esta forma, GNU Smalltalk actúa más como un intérprete que como un entorno a la manera tradicional de Smalltalk.
GNU Smalltalk incluye enlaces para muchas bibliotecas de software libre, incluidas SQLite , libSDL , cairo , gettext y Expat .
Ejemplos de
Estos ejemplos solo funcionan en GNU Smalltalk 3.0 y versiones posteriores. Ejemplo clásico de Hello world :
'¡Hola Mundo!' displayNl
Algún código básico de Smalltalk:
"Todo, incluido un literal, es un objeto, así que esto funciona:" -199 abs "199" ' gst is cool ' size "11" ' Slick ' indexOf: $ c "4" ' Nice Day Is ' t It? ' asLowercase asSet asSortedCollection asString "′? acdeinsty"
Colecciones
Construyendo y usando una matriz :
a : = # ( 1 'hola' 3.14 1 2 ( 4 5 ))a en: 3 "3,14" a reversa "((4 5) 2 1 3,14 'hi' 1)" a asSet "Set (1 'hi' 3,14 2 (4 5))"
Construyendo y usando un hash :
hash : = Diccionario de: { 'agua' -> 'mojado' . 'fuego' -> 'caliente' } . hash en: 'fuego' "Impresiones: caliente"hash keysAndValuesDo: [ : k : v | ( '% 1 es% 2' % { k . V }) displayNl ]"Impresiones: el agua está mojada, el fuego está caliente"hash removeKey: 'agua' "Elimina 'agua' -> 'mojado'"
Bloques e iteradores
Parámetro-pasar un bloque para ser un cierre :
"Recuerda un bloque". recuerda : = [ : nombre | ( '¡Hola,% 1!' % { Nombre }) displayNl ] ."Cuando sea el momento adecuado, ¡llame al cierre!" recordar valor: 'mundo' "=> '¡Hola, mundo!'"
Devolución de cierres de un método:
Integer extender [ asClosure [ | valor | valor : = self . ^ {[ : x | valor : = x ] . [ valor ]} ] ] bloques : = 10 asClosure . setter : = bloques primero . getter : = segundos de bloques . getter valor "=> 10" setter valor: 21 "=> 21" getter valor "=> 21"
Usando bloquear para enviar información a la persona que llama:
Entero extendido [ ifEven: evenBlock ifOdd: oddBlock [ ^ self even ifTrue: [ evenBlock value: self ] ifFalse: [ oddBlock value: self ] ] ]
Invoque el método anterior, pasándole un bloque:
10 siEven: [ : n | n / 2 ] ifOdd: [ : n | n * 3 + 1 ] "=> 5"
Iterando sobre enumeraciones y matrices usando bloques:
matriz : = # ( 1 'hola' 3.14 ) matriz hacer: [ : elemento | item displayNl ] "=> 1" "=> hola" "=> 3.14"( 3 a: 6 ) hacer: [ : item | item displayNl ] "=> 3" "=> 4" "=> 5" "=> 6"
Un método como inject: into: puede aceptar tanto un parámetro como un bloque. Se itera sobre cada miembro de una lista, realizando alguna función mientras retiene un agregado. Esto es análogo a la función foldl en los lenguajes de programación funcionales . Por ejemplo:
# ( 1 3 5 ) inyectar: 10 en: [ : suma : elemento | suma + elemento ] "=> 19"
En la primera pasada, el bloque recibe 10 (el argumento a inyectar) como suma y 1 (el primer elemento de la matriz) como elemento. Esto devuelve 11. 11 luego se convierte en suma en la siguiente pasada, que se suma a 3 para obtener 14. A continuación, se suma 14 a 5, para finalmente devolver 19.
Los bloques funcionan con muchos métodos integrados:
( Nombre de archivo : 'file.txt' ) withWriteStreamDo: [ : file | file nextPutAll: 'Escribió un texto'. ; nl ] "El archivo se cierra automáticamente aquí"( Nombre de archivo : 'file.txt' ) linesDo: [ : each | cada pantallaNl ]"=> Escribí un texto."
Usando una enumeración y un bloque para elevar al cuadrado los números del 1 al 10:
( 1 a: 10 ) recolectar: [ : x | x al cuadrado ] "=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]"
Clases
El siguiente código define una clase llamada Persona. Al derivar de Magnitud, define automáticamente todos los métodos de comparación excepto uno ( <
). Con la adición de ese, asSortedCollection
puede ordenar por edad. Tenga en cuenta que podemos anular la forma en que se imprime / muestra el objeto (el valor predeterminado es compartir la representación de la impresión del programador y la visualización del usuario) anulando printOn:
.
Subclase de magnitud : Persona [ | edad del nombre | Clase de persona >> nombre: nombre edad: edad [ ^ nombre nuevo propio : nombre ; edad: edad ; tú mismo ] < aPerson [ ^ self age < aPerson age ] name [ ^ name ] name: value [ name : = value ] age [ ^ age ] age: value [ age : = value ] printOn: aStream [ aStream nextPutAll: ( '% 1 ( % 2) ' % { nombre . Edad })]]grupo : = { Nombre de la persona : 'Dan' edad: 23 . Nombre de la persona : 'Mark' edad: 63 . Nombre de la persona : 'Cod' Edad: 16 .}.group asSortedCollection reverso
Lo anterior imprime tres nombres en orden inverso de edad:
OrderedCollection (Mark (63) Dan (23) Cod (16))
Excepciones
Se genera una excepción con una halt
llamada:
auto parada
Se puede agregar un mensaje opcional a la excepción; también hay error:
un tipo diferente de excepción:
auto detuvo: 'Este es un mensaje de' auto de error: 'Este es un mensaje'
En realidad, estos son contenedores para el método de generación de excepciones real signal
:
Señal de error Señal de error : '¡Argumentos ilegales!'
Las excepciones se manejan mediante on:do:
bloques.
[ algo que hacer ] en: Excepción hacer: [ : ex | manejar la excepción en ex ]
Por supuesto, solo puede detectar excepciones particulares (y sus subclases):
[ algo que hacer ] en: Advertencia hacer: [ : ex | manejar la excepción en ex ]
Es posible utilizar el objeto de excepción, que está disponible para la cláusula del controlador, para salir o reanudar el primer bloque; salir es el valor predeterminado, pero también se puede mencionar explícitamente:
[ Señal de error : 'foo' ] en: Error hacer: [ : ex | ex retorno: 5 ]( Señal de advertencia : '¿ahora qué?' ) PrintNl "=> nil"
[( Señal de advertencia : '¿ahora qué?' ) PrintNl ] en: Advertencia do: [ : ex | ex resume: 5 ] "=> 5"