{"id":473,"date":"2017-11-20T08:00:14","date_gmt":"2017-11-20T07:00:14","guid":{"rendered":"http:\/\/www.programaraciegas.net\/?p=473"},"modified":"2017-11-18T23:20:45","modified_gmt":"2017-11-18T22:20:45","slug":"bucles-en-applescript","status":"publish","type":"post","link":"https:\/\/programaraciegas.net\/?p=473","title":{"rendered":"Bucles en AppleScript"},"content":{"rendered":"<p>AppleScript, al igual que otros lenguajes de programaci\u00f3n, nos permite utilizar una serie de estructuras de c&oacute;digo para repetir una serie de comandos un n&uacute;mero determinado de veces. Esto resulta muy &uacute;l para evitar tener que escribir demasiado c&oacute;digo repetido<\/p>\n<p>Por ejemplo imaginemos que queremos realizar un script que cuente desde 1 hasta 10. Si no supiesemos utilizar ninguna estructura de bucle o para repetir un trozo de c&oacute;digo nuestro script deber&iacute;a ser algo parecido a lo siguiente:<\/p>\n<p><code><br \/>\non run<br \/>\n\tset valor to 1<br \/>\n\tsay valor<br \/>\n\tset valor to valor + 1<br \/>\n\tsay valor<br \/>\n\tset valor to valor + 1<br \/>\n\tsay valor<br \/>\n\tset valor to valor + 1<br \/>\n\tsay valor<br \/>\n\tset valor to valor + 1<br \/>\n\tsay valor<br \/>\n\tset valor to valor + 1<br \/>\n\tsay valor<br \/>\n\tset valor to valor + 1<br \/>\n\tsay valor<br \/>\n\tset valor to valor + 1<br \/>\n\tsay valor<br \/>\n\tset valor to valor + 1<br \/>\n\tsay valor<br \/>\n\tset valor to valor + 1<br \/>\n\tsay valor<br \/>\nend run<br \/>\n<\/code><\/p>\n<p>El c&oacute;digo escrito es repetitivo, poco elegante y poco eficiente a la hora de ser mantenido o modificado en el futuro.<\/p>\n<p>Para poder solucionar este problema AppleScript nos proporciona la estructura <strong>repeat<\/strong> que repite un n&uacute;mero de veces determinado el c&oacute;digo situado entre la orden <strong>repeat<\/strong> y <strong>end repeat<\/strong>. Nuestro script anterior podr&iacute;a quedar as&iacute;:<\/p>\n<p><code><br \/>\non run<br \/>\n\tset valor to 1<br \/>\n\trepeat 10 times<br \/>\n\t\tsay valor<br \/>\n\t\tset valor to valor + 1<br \/>\n\tend repeat<br \/>\nend run<br \/>\n<\/code><\/p>\n<p>Al ejecutar el script obtendremos el mismo resultado pero habremos escrito menos l&iacute;neas de c&oacute;digo y adem&aacute;s queda m&aacute;s claro que existe una acci&oacute;n repetida varias veces dentro del script.<\/p>\n<p>Si en el comando <strong>repeat<\/strong> no indicamos el n&uacute;mero de veces que debe repetirse el bloque de c&oacute;digo se entrar&aacute; en un bucle infinito. Por ejemplo, si cambiamos nuestro ejemplo anterior dejando la l&iacute;nea <em>repeat 10 times<\/em> por s&oacute;lo <em>repeat<\/em> y lo ejecutamos el script no parar&aacute; de contar hasta que nosotros interrumpamos la ejecuci&oacute;n del script.<\/p>\n<p>Un bucle de ejecuci&oacute;n infinita es muy peligroso ya que provocar&aacute; que nuestro ordenador entre en un proceso sin fin y cada vez haya menos recursos disponibles para la m&aacute;quina. Es muy probable que hayamos visto comportamientos similares cuando nuestro tel&eacute;fono u ordenador personal realiza un proceso que provoca que la temperatura del dispositivo aumenta, se ralentiza la ejecuci&oacute;n de todo el sistema operativo y cualquier acci&oacute;n que intentemos se realizar&aacute; de forma muy pausada y con interrupciones. Esto puede deberse a que una aplicaci&oacute;n est&aacute; ejecutando un bucle infinito o de muy larga duraci&oacute;n, por ejemplo convertir un fichero de v&iacute;deo o un proceso que requiera de muchos minutos para completarse.<\/p>\n<p>Por todo esto siempre debemos incluir cl&aacute;usulas de interruptci&oacute;n de un bucle en cualquier lenguaje de programaci&oacute;n que utilicemos, incluido AppleScript.<\/p>\n<p>Para salir de una estructura <strong>repeat<\/strong> AppleScript nos proporciona el comando <strong>exit<\/strong>. Veamos nuestro ejemplo inicial pero utilizando un bucle infinito con su cl&aacute;usula de ejecuci&oacute;n controlada para que se termine cuando hayamos verbalizado el valor 10. El c&oacute;digo ser&iacute;a el siguiente:<\/p>\n<p><code><br \/>\non run<br \/>\n\tset valor to 1<br \/>\n\trepeat<br \/>\n\t\tsay valor<br \/>\n\t\tset valor to valor + 1<br \/>\n\t\tif valor = 11 then<br \/>\n\t\t\texit repeat<br \/>\n\t\tend if<br \/>\n\tend repeat<br \/>\nend run<br \/>\n<\/code><\/p>\n<p>Pero este c&oacute;digo sigue sin ser del todo apropiado. En nuestro ejemplo sabemos que queremos ir desde el valor 1 hasta el 10. En los casos en que sabemos el valor de inicio y de finalizaci&oacute;n y adem&aacute;s necesitamos una variable que nos indique en qu&eacute; n&uacute;mero de la iteraci&oacute;n del bucle nos encontramos el comando <strong>repeat<\/strong> nos permite declarar una variable para controlar el bucle e indicar el valor de comienzo y el valor de finalizaci&oacute;n para el bucle. Veamos un ejemplo para que nos diga los n&uacute;meros entre el 10 y el 20. El c&oacute;digo ser&iacute;a el siguiente:<\/p>\n<p><code><br \/>\non run<br \/>\n\trepeat with valor from 10 to 20<br \/>\n\t\tsay valor<br \/>\n\tend repeat<br \/>\nend run<br \/>\n<\/code><\/p>\n<p>Es necesario tener en cuenta que la estructura <strong>repeat with from to<\/strong> s&oacute;lo se ejecutar&aacute; si el valor indicado en <strong>from<\/strong> es menor que el indicado en <strong>to<\/strong>, lo que significa que el bucle se ejecutar&aacute; si se va de un n&uacute;mero hacia otro n&uacute;mero mayor. Por ejemplo, si intentamos hacer una cuenta atr&aacute;s el script siguiente no se ejecutar&aacute;:<\/p>\n<p><code><br \/>\non run<br \/>\n\trepeat with valor from 10 to 1<br \/>\n\t\tsay valor<br \/>\n\tend repeat<br \/>\nend run<br \/>\n<\/code><\/p>\n<p>Para solucionar este problema debemos usar nuestro ingenio para superar las limitaciones del lenguaje de programaci&oacute;n que estemos utilizando. Una posible soluci&oacute;n ser&iacute;a la siguiente:<\/p>\n<p><code><br \/>\non run<br \/>\n\trepeat with valor from 1 to 10<br \/>\n\t\tset cuentaAtras to 11 - valor<br \/>\n\t\tsay cuentaAtras<br \/>\n\tend repeat<br \/>\n\tsay \"\u00a1Boom!\"<br \/>\nend run<br \/>\n<\/code><\/p>\n<p>AppleScript proporciona otras variantes de la estructura de bucle <strong>repeat<\/strong> pero pueden resultar menos eficientes o m&aacute;s complejas de controlar. M&aacute;s adelante veremos algunas de ellas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>AppleScript, al igual que otros lenguajes de programaci\u00f3n, nos permite utilizar una serie de estructuras de c&oacute;digo para repetir una serie de comandos un n&uacute;mero determinado de veces. Esto resulta muy &uacute;l para evitar tener que escribir demasiado c&oacute;digo repetido Por ejemplo imaginemos que queremos realizar un script que cuente desde 1 hasta 10. Si &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/programaraciegas.net\/?p=473\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \u00abBucles en AppleScript\u00bb<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[80,6],"tags":[],"class_list":["post-473","post","type-post","status-publish","format-standard","hentry","category-applescript","category-programacion"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=473"}],"version-history":[{"count":0,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/473\/revisions"}],"wp:attachment":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}