Las funciones de AutoHotkey son muy útiles para programar. En este artículo veremos algunos ejemplos y las posibilidades que tienes con las funciones.
Subrutinas de AutoHotkey
Antes de entrar en las funciones de AutoHotkey, veremos rápidamente las subrutinas, ya que pueden entenderse como un caso simplificado de las funciones.
Una subrutina en cualquier lenguaje de programación es un trozo de código independiente que se ejecuta cuando se la llama y, cuando termina, vuelve al punto que la llamó.
Gráficamente, se puede explicar una subrutina así:
En algún punto del código se llama a la subrutina, se ejecuta el código de la subrutina y, cuando finaliza la subrutina, se vuelve al punto que llamó a la subrutina.
En AutoHotkey, las subrutinas se llaman con la función Gosub, seguida del nombre de la subrutina.
La subrutina en sí empieza con su nombre, seguido del signo de dos puntos (:) y, finalmente, el código que necesites.
Por ejemplo, si quieres sumar dos números a y b cada vez que pulses la tecla F12, podrías conseguirlo con este sencillo código de AutoHotkey:
F12:: a:=3 b:=7 Gosub sumar MsgBox La suma es = %suma% Return sumar: suma:= a+b Return
La línea 4 llama a la subrutina sumar.
La subrutina sumar empieza en la línea 8 y termina con la línea Return, momento en que devuelve el control a la línea 4. Como no hay que hacer nada más en esta línea, se ejecuta la siguiente línea (5).
Al pulsar F12, se mostrará el siguiente cuadro de diálogo:
Nada impide tener todas las subrutinas que necesites en tu macro de AutoHotkey. Por ejemplo, aquí tienes una subrutina sumar y otra multiplicar:
F12:: a:=3 b:=7 Gosub sumar Gosub multiplicar MsgBox La suma es = %suma%`nEl producto es = %producto% Return sumar: suma:= a+b Return multiplicar: producto:= a*b Return
Al pulsar F12, se mostrará el siguiente cuadro de diálogo:
Evidentemente, estas subrutinas dadas como ejemplos son muy sencillas, pero puedes complicarlas todo lo que quieras.
En ocasiones, las subrutinas se quedan «cortas» para lo que quieres conseguir con la macro de AutoHotkey y es mejor emplear las funciones, que son mucho más potentes, como veremos en la siguiente sección.
⁂
Funciones de AutoHotkey
Las funciones más sencillas son muy similares a las subrutinas de AutoHotkey.
1. Función sencilla
Por ejemplo, para sumar 3 y 7 al pulsar F12 con una función sencilla de AutoHotkey sería así:
F12:: sumar() Return sumar() { a:=3 b:=7 suma:=a+b MsgBox La suma es = %suma% Return }
Nota: el nombre de la función es independiente de las mayúsculas y minúsculas; es decir, se puede llamar a la función sumar(), con Sumar() o con SUMAR(), por ejemplo.
MUY IMPORTANTE: no hay ningún espacio entre el nombre de la función y el paréntesis de apertura (líneas 2 y 5).
La función termina con la línea Return (línea 11) o con el símbolo de cierre de llaves (línea 12), lo que primero se encuentre.
Como ves, esta sencilla función no es muy diferente de las subrutinas vistas al principio.
Pero lo bueno empieza ahora, ya verás…
2. Función con parámetros
En las funciones podemos enviar parámetros:
F12:: sumar(3,7) sumar(5,9) Return sumar(a,b) { suma:=a+b MsgBox La suma es = %suma% }
De esta forma, podemos calcular las sumas con los sumandos que queramos, ya que solo tenemos que enviarlos como parámetros (3,7 y 5,9 en este ejemplo).
Si te fijas, en esta macro de AutoHotkey hemos quitado la línea Return y funciona perfectamente.
3. Función que devuelve un valor
En este ejemplo, la función devuelve el valor que acompaña a la función Return (a+b, en la línea 8):
F12:: suma:=sumar(3,7) MsgBox La suma es = %suma% Return sumar(a,b) { Return a+b }
La función suma los valores de las variables a y b antes de devolver el valor de la suma (línea 8).
En general, todas las funciones devuelven un valor aunque no haya un Return explícito. Por ejemplo, tanto en el primer ejemplo (que tenía una línea con Return) como en el segundo (que no tenía una línea con Return) la función devuelve cero (o una cadena vacía, que es lo mismo).
4. Función con parámetros opcionales
Es posible que el número de parámetros enviados a la función no coincida exactamente con el que puede recibir la función. En este caso, el último o últimos parámetros son opcionales y deben ir de una forma especial.
Por ejemplo, una función que sume 2 o 3 sumandos sería así:
F12:: suma:=sumar(3,7) MsgBox La suma es = %suma% suma:=sumar(3,7,11) MsgBox La suma es = %suma% Return sumar(a,b,c:=0) { Return a+b+c }
Después de la primera llamada a la función (línea 2), tendremos el siguiente cuadro de diálogo:
Cuando solo se envían 2 parámetros, la función toma el tercer parámetro c como cero (c se inicializa en cero si no hay un tercer parámetro) y suma los 2 primeros sumandos (más el tercero, c, que es cero).
Mientras que tras la segunda llamada (línea 4), AutoHotkey nos mostrará:
En este caso se envían 3 parámetros y la función suma los 3 sumandos normalmente.
⁂
Variables locales, estáticas y globales en las funciones de AutoHotkey
1. Variables locales
Las variables locales de las funciones solo sirven dentro de la función. Además, no importa si fuera de la función existen variables con el mismo nombre. Cada vez que se llame a una función, sus variables locales se inicializan en cero. Al terminar la función, las variables locales, simplemente, «desaparecen».
Las variables de los parámetros dentro de la función son locales a la función, es decir, son copias de la variable pasada a la función.
Por ejemplo, al pulsar F12, el siguiente código:
F12:: a:=1 incrementar(a) MsgBox % a Return incrementar(a) { a:=a+1 Return a }
mostrará «1», no «2»:
El motivo es que la variable a local a la función es independiente de la variable a externa.
¿Está entendido este punto de las variables locales?
Esto es así, excepto en un par de casos, que vamos a ver con más detalle:
- variables estáticas
- variables globales
2. Variables estáticas
Las variables, llamadas estáticas, son especiales, porque recuerdan su valor cada vez que se llama a la función.
Por ejemplo, en este código de AutoHotkey:
F12:: función() Return función() { static yaHasPasadoporAquí:= false if yaHasPasadoporAquí MsgBox Ya has pasado por aquí yaHasPasadoporAquí:=true }
la variable yaHasPasadoporAquí definida como static en la línea 7 hace que no suceda nada la primera vez que pulses F12. Pero la segunda y sucesivas se mostrará el siguiente mensaje:
El motivo es que se trata de una variable estática (la función «recuerda» su valor en cada llamada).
Nota: las variables y los nombres de funciones y subrutinas pueden tener tildes y eñes.
Para que todas las variables dentro de la función sean estáticas por defecto, hay que declarar static sin ninguna variable detrás (línea 3):
funciónConTodasLasvariablesEstáticas() { static ; Aquí tu código }
3. Variables globales
Si quieres emplear un nombre de variable dentro de una función que coincida con otra variable externa y que al terminar la función la variable externa recuerde el valor de dicha variable dentro de la función, entonces tienes que usar una variable global.
Para que una variable sea global, hay que declararla cono global, en lugar de static (línea 3):
F12:: variableGlobal:=true alternar() Return alternar() { global variableGlobal variableGlobal:=!variableGlobal }
En esta función, la variable variableGlobal es global e irá alternando entre los valores true y false.
Para que todas las variables dentro de la función sean globales por defecto, hay que declarar global sin ninguna variable detrás:
funciónConTodasLasvariablesGlobales() { global ; Aquí tu código }
Es posible que todo esto te parezca muy árido, quizás innecesario, pero de lo que estoy seguro es que si programas mínimamente en AutoHotkey, algún día volverás para ver qué era eso de las variables estáticas y globales. Por eso, quédate con la copla de que es útil saber qué son…
4. Función que devuelve más de un valor
Según lo visto hasta ahora, una función solo puede devolver un valor. Pero ¿cómo se puede hacer que devuelva más de un valor?
Sin complicarnos más la vida, podemos emplear un truco en este ejemplo: intercambiar los valores de las variables a y b.
F12:: a:=1 b:=2 intercambiar(a,b) MsgBox % a b Return intercambiar(ByRef a, ByRef b) { temporal:=a a:=b b:=temporal }
En este caso se ha conseguido añadiendo ByRef a cada parámetro dentro de la función. Por tanto, las variables a y b internas de la función son una referencia a las variables a y b externas y esta función intercambia los valores de las variables a y b externas.
¿Entendido lo que puedes conseguir con los parámetros ByRef?
Para este truco, no es necesario que las variables internas de la función tengan el mismo nombre que las externas. La prueba es que la siguiente función intercambiar2(), con variables locales v1 y v2, funciona igual de bien que la anterior:
intercambiar2(ByRef v1, ByRef v2) { temporal:=v1 v1:=v2 v2:=temporal }
⁂
Rizando el rizo con las funciones de AutoHotkey
1. Funciones que contienen subrutinas
Una función puede contener subrutinas internas y también puede llamar a subrutinas que están fuera de la función:
2. Funciones que llaman a otras funciones
Aunque una función no puede contener funciones, no hay ningún problema en que una función llame a otras funciones:
Por ejemplo, la siguiente función calcula la hipotenusa sabiendo dos catetos del triángulo:
F12:: laHipotenusa:=hipotenusa(3,4) MsgBox, La hipotenusa es = %laHipotenusa% Return hipotenusa(cateto1,cateto2) { Return Sqrt(sumaCuadrática(cateto1,cateto2)) } sumaCuadrática(a,b) { Return a*a + b*b }
Es decir, en este ejemplo, al pulsar F12, la línea 2 llama a la función hipotenusa (línea 6) con los dos catetos como parámetros; la función hipotenusa llama en la línea 8 a la función sumaCuadrática (línea 11), que devuelve la suma de los cuadrados de los dos parámetros a y b (línea 13). La función hipotenusa calcula ahora entonces la raíz cuadrada de la suma cuadrática con la función Sqrt, una función integrada en AutoHotkey, y devuelve ese valor (línea 8) al hilo principal del código (línea 2). En realidad, la función hipotenusa llama a dos funciones: sumaCuadrática y Sqrt.
Al pulsar F12, se mostrará el siguiente cuadro de diálogo:
dando la respuesta correcta de 5,0.
Por supuesto, se podría haber hecho el cálculo con una sola función.
⁂
Beneficios de las funciones de AutoHotkey
Los beneficios de las funciones de AutoHotkey son:
- Código más legible. Cuanto más emplees una función, más fácilmente entenderás el código, en vez de verlo repetido muchas veces en la macro.
- Código más pequeño, menos líneas. Siempre se agradece la simplicidad. La máxima de «lo simple es bello» sigue siendo verdad para los programadores.
- El código con funciones se mantiene más fácilmente. Es decir, que si haces un cambio, lo haces en la función una sola vez y no repetir el cambio en todas las apariciones del código de AutoHotkey. Esto hace el código más seguro también, porque minimizas los cambios de código y la posibilidad de equivocarte.
- Flexibilidad al programar, porque puedes pasar parámetros.
- Permite devolver valores.
- Permite crear un diseño modular (esto lo veremos en un próximo artículo).
En el siguiente artículo veremos una aplicación de las funciones de AutoHotkey en el trabajo de un traductor, para que veas que esto de las funciones puede ser muy útil para ti.
⁂
Nada más, solo un par de recomendaciones si te interesa leer más sobre AutoHotkey o si quieres estar al tanto de los nuevos artículos de Gonduana:
- Lee los otros artículos de AutoHotkey de este mismo blog. Los tienes todos si filtras por «AutoHotkey» en la nube de etiquetas (columna derecha del blog).
- Suscríbete al boletín del blog, o sígueme en LinkedIn o Twitter (@jssprt). De esta manera, serás el primero en enterarte de la publicación de los artículos.
hola en esta pagina yo he podido encontrar un montón de información que ya haba teniendo semanas sin responder mis respuestas luchando para conseguirla la información.
Me alegro de que te resultaran útiles las funciones de AutoHotkey.
Un abrazo,
… Jesús Prieto …