Some days ago I discovered a new language called Io (that's capital 'i' and 'o'). It's inspired by smalltalk, but with few features of other languages like self, lisp or lua. FYI, I discovered it among other cool languages. There are even more esoteric languages here.
First thing to say about Io is it's minimalist. Really minimalist. Only look at it's site to see it. As a minimalist language, its doc is also minimalist, so you have to understand the little doc fully, and I mean *really* understand. Io is a Prototype-based language with a syntax similar to smalltalk, but more minimal (assignation is a message too). Its introspection is astonishing aswell, and it introduces a concept of context which I'm still not very confortable with.
Anyway, I've already written my first program (a typical guessing number game) for Io. Here's the code.
guesser := Object clone
guesser toGuess := Random value(100) ceil
file := File standardInput
guess := file readLine asNumber
while(guess != guesser toGuess,
   if(guess < guesser toGuess,
     "higher" println,
     "lower" println)
   guess = file readLine asNumber
)
"ok, el numero es " print
guesser toGuess println
Ah! comunity is very friendly and willing to help (you can find them at #io @freenode
jueves, 25 de diciembre de 2008
jueves, 4 de diciembre de 2008
sbbuilder is out
Bien. He hecho mi primera aplicación oficial para vector linux ( http://www.vectorlinux.com )
Es un programa para generar SlackBuilds con la estructura correcta para añadirlo en los repos sin dificultad.
Link al anuncio.
Disfruten de la simplicidad de perl + Template Toolkit para hacer algo util en apenas 40 lineas
Es un programa para generar SlackBuilds con la estructura correcta para añadirlo en los repos sin dificultad.
Link al anuncio.
Disfruten de la simplicidad de perl + Template Toolkit para hacer algo util en apenas 40 lineas
miércoles, 3 de diciembre de 2008
Popen en squeak. pipe entre el proceso externo y el caller
En un post anterior me preguntaba como capturar la info de un comando que tiramos al sistema. Pues bien, la solucion es sencilla.
Abrir el universe package browser e instalar 2 paquetes: OSProcess y commandShell (los 2 estan en Tools IIRC). Las ultimas versiones, por favor :)
Bien, pues una vez tenemos los paquetes instalados (con sus deps), solo tenemos que ejecutar
Ahi lo tenemos. Sencillo, eh?
Saludos
En http://wiki.squeak.org/squeak/572 encontre la solucion.
Abrir el universe package browser e instalar 2 paquetes: OSProcess y commandShell (los 2 estan en Tools IIRC). Las ultimas versiones, por favor :)
Bien, pues una vez tenemos los paquetes instalados (con sus deps), solo tenemos que ejecutar
salida := (PipeableOSProcess command: 'ls') output .
Ahi lo tenemos. Sencillo, eh?
Saludos
En http://wiki.squeak.org/squeak/572 encontre la solucion.
lunes, 1 de diciembre de 2008
modifying constructors
En smalltalk es una práctica común (por lo que he visto) hacer muchas funciones para crear un objeto determinado, es decir, hacer una creadora enganchada a uno o varios setters.
De un objeto paquete, podriamos tener las siguientes creadoras:
new
createWithContent:
createWithContent:andDestination:
Bien, como bien sabemos, todo es un objeto y todo eso... y cuando decimos todo es TODO. las instancias son objetos, las funciones son objetos, las clases son objetos... y claro, si las clases son objetos, la particularidad que tienen es que son capaces de crear otros objetos (las simples instancias no pueden).
Para hacer nuevas constructoras de clase, debemos modificar la clase, o sea pinchar en 'Class', y definir la nueva funcion ahi.
createWithContent: aString
|temp|
temp := self new.
temp content: aString.
^temp.
De esta forma, hemos creado una nueva funcion constructora, que aprovecha el viaje para setear un valor.
Si analizamos lo que hace es bien sencillo. simplemente notar que self new se refiere a Paquete new , o sea, la creadora que hubieramos llamado si no tuvieramos el parametro extra. new es un metodo que implementan las Clases, no las instancias.
Log donde aprendí esto (en català) : http://raimonster.googlepages.com/smalltalk3_new_initialize.txt .
Gracias a Gerard por la ayuda.
De un objeto paquete, podriamos tener las siguientes creadoras:
new
createWithContent:
createWithContent:andDestination:
Bien, como bien sabemos, todo es un objeto y todo eso... y cuando decimos todo es TODO. las instancias son objetos, las funciones son objetos, las clases son objetos... y claro, si las clases son objetos, la particularidad que tienen es que son capaces de crear otros objetos (las simples instancias no pueden).
Para hacer nuevas constructoras de clase, debemos modificar la clase, o sea pinchar en 'Class', y definir la nueva funcion ahi.
createWithContent: aString
|temp|
temp := self new.
temp content: aString.
^temp.
De esta forma, hemos creado una nueva funcion constructora, que aprovecha el viaje para setear un valor.
Si analizamos lo que hace es bien sencillo. simplemente notar que self new se refiere a Paquete new , o sea, la creadora que hubieramos llamado si no tuvieramos el parametro extra. new es un metodo que implementan las Clases, no las instancias.
Log donde aprendí esto (en català) : http://raimonster.googlepages.com/smalltalk3_new_initialize.txt .
Gracias a Gerard por la ayuda.
miércoles, 26 de noviembre de 2008
Domingos
Hay domingos que molan muuuuuuuucho.
Aquellos de sofa y tele y esperar que pasen las horas, y mirar alrededor, y decir: "Joer, que bien que estoy, aunque mañana vuelva a ser un dia de mierda"
Aquellos de sofa y tele y esperar que pasen las horas, y mirar alrededor, y decir: "Joer, que bien que estoy, aunque mañana vuelva a ser un dia de mierda"
viernes, 21 de noviembre de 2008
Squeak interactuando con el exterior
Squeak funciona francamente bien cuando se refiere a cosas dentro de la imagen (depuracion, control de objetos, introspeccion....). pero para empezar a prototipar cosillas, encontré que necesitaba que pudirera comunicarme con el exterior (que siempre es el problema de las VM).
Bien, pues para hacerlo, he diferenciado 3 casos: Leer un fichero del exterior, ejecutar un comando tipo system, y finalmente ejecutar un comando y captar la salida.
Leer un fichero exterior
En entorno squeak, los ficheros no tienen mucho sentido ya que todo esta latente en la imagen, con lo que el mismo codigo es el sistema, que esta organizado en clases....blablabla....
Sin embargo, si necesitamos leer un fichero, como cojones lo hacemos? Pues bien facil:
Ref: http://wiki.squeak.org/squeak/1583
Ejecutar un comando con 'system'
bien, ahora quiero ejecutar un programa del sistema host, no de la imagen de squeak (¿existe el concepto programa en squeak?)
Yo lo he conseguido metiendo lo siguiente en el workspace:
Nota: Para GNU Smalltalk se puede usar
Popen en squeak. pipe entre el proceso externo y el caller
No lo he conseguido :( . Seguiremos informando
Copy&Paste
Q: Eh tio, no puedo copiar y pegar el codigo de mi SO a squeak...
A: Edita tu ~/.Xresources y añade
*VT100.translations: #override\
<> : select-end(PRIMARY, CUT_BUFFER0, CLIPBOARD)\n\
<> : insert-selection(PRIMARY, CUT_BUFFER0, CLIPBOARD)\n\
<> : select-end(PRIMARY, CUT_BUFFER0, CLIPBOARD)
~
Bien, pues para hacerlo, he diferenciado 3 casos: Leer un fichero del exterior, ejecutar un comando tipo system, y finalmente ejecutar un comando y captar la salida.
Leer un fichero exterior
En entorno squeak, los ficheros no tienen mucho sentido ya que todo esta latente en la imagen, con lo que el mismo codigo es el sistema, que esta organizado en clases....blablabla....
Sin embargo, si necesitamos leer un fichero, como cojones lo hacemos? Pues bien facil:
a := CrLfFileStream fileNamed: '/tmp/a.pl'.Sin el CrLf, el objeto FileStream no interpreta los finales de linea, y printara el archvo con caracteres raros.
string := a contentsOfEntireFile .
Transcript show: string.
a close
Ref: http://wiki.squeak.org/squeak/1583
Ejecutar un comando con 'system'
bien, ahora quiero ejecutar un programa del sistema host, no de la imagen de squeak (¿existe el concepto programa en squeak?)
Yo lo he conseguido metiendo lo siguiente en el workspace:
UnixProcess command: 'ratmen hola hola adeu adeu'.Esto esta en el paquete OSProcess, si no lo tienes, instalalo usando el universe package browser o el SqueakMap.
Nota: Para GNU Smalltalk se puede usar
SystemDictionary system: aStringRef: http://www.cs.utah.edu/dept/old/texinfo/mst/mst.htmlPopen en squeak. pipe entre el proceso externo y el caller
No lo he conseguido :( . Seguiremos informando
Copy&Paste
Q: Eh tio, no puedo copiar y pegar el codigo de mi SO a squeak...
A: Edita tu ~/.Xresources y añade
*VT100.translations: #override\
<> : select-end(PRIMARY, CUT_BUFFER0, CLIPBOARD)\n\
<> : insert-selection(PRIMARY, CUT_BUFFER0, CLIPBOARD)\n\
<> : select-end(PRIMARY, CUT_BUFFER0, CLIPBOARD)
~
miércoles, 19 de noviembre de 2008
Problema:
Tengo un archivo con el formato siguiente:
-------------BOF
Matriu 0
1foo.map VS 0.A.map 0.565 0.382291 0.370989 0.298857 0.705638
....
1foo.map VS 0.e.map 0.257588 0.940875 0.872144 0.634201 0.844375
MITJA1_0= 0.574908 0.353649 0.339477 0.268343 0.691255
MITJA2_0= 0.55557 0.307795 0.296409 0.235522 0.517165
MITJA3_0= 0.492392 0.527022 0.484869 0.354612 0.536407
Estadisticas: 1, 2, 3 ,4,5
Matriu 1
1foo.map VS 1.A.map 0.521194 0.479164 0.464836 0.374049 0.753356
1foo.map VS 1.Br.map 0.521194 0.479164 0.464836 0.374049 0.759565
...
-----------EOF
Necesito agrupar los valores de la ultima columna (negrita), poniendolos en una fila, y en cada fila tiene que haber los valores del mismo 'map'. (cursiva). Como quedarse con las ultimas columnas y trasponer....
Ah, suponemos que tenemos unos 1500 maps distintos, y que cada map tiene 22 valores.
Bien, pues esto, nose como lo haríais, pero si encontrais algo que supere esto, me lo comentais ;)
:g:^[^1]:d
:%s:.*VS::
:%s:.* ::
qq22Jjq
1500@@
Efectivamente, solo eso
Tengo un archivo con el formato siguiente:
-------------BOF
Matriu 0
1foo.map VS 0.A.map 0.565 0.382291 0.370989 0.298857 0.705638
....
1foo.map VS 0.e.map 0.257588 0.940875 0.872144 0.634201 0.844375
MITJA1_0= 0.574908 0.353649 0.339477 0.268343 0.691255
MITJA2_0= 0.55557 0.307795 0.296409 0.235522 0.517165
MITJA3_0= 0.492392 0.527022 0.484869 0.354612 0.536407
Estadisticas: 1, 2, 3 ,4,5
Matriu 1
1foo.map VS 1.A.map 0.521194 0.479164 0.464836 0.374049 0.753356
1foo.map VS 1.Br.map 0.521194 0.479164 0.464836 0.374049 0.759565
...
-----------EOF
Necesito agrupar los valores de la ultima columna (negrita), poniendolos en una fila, y en cada fila tiene que haber los valores del mismo 'map'. (cursiva). Como quedarse con las ultimas columnas y trasponer....
Ah, suponemos que tenemos unos 1500 maps distintos, y que cada map tiene 22 valores.
Bien, pues esto, nose como lo haríais, pero si encontrais algo que supere esto, me lo comentais ;)
:g:^[^1]:d
:%s:.*VS::
:%s:.* ::
qq22Jjq
1500@@
Efectivamente, solo eso
Suscribirse a:
Entradas (Atom)