# AppleScript

Applescript es un lenguaje de programación desarrollado por Apple y diseñado para su ejecución bajo los sistemas Mac OS. Genéricamente, Applescript es la palabra usada para designar el entorno de Scripts de Mac OS, pensado para operar en paralelo a la GUI.

## Historia

El proyecto Applescript fue una rama derivada del proyecto HyperCard. HyperCard contenía un lenguaje de programación basado en la lengua Inglesa llamado HyperTalk, que podía ser usado para incluir contenido lógico en un programa de HyperCard. Los ingenieros de Apple pensaron que podría diseñarse un lenguaje de scripts similar para ser usado con cualquier aplicación, y el proyecto Applescript ahí dio comienzo.
MacOS necesitó profundos cambios y mejoras para implementar Applescript. Muchos de estos cambios se publicaron con el lanzamiento del sistema 7, principalmente el concepto del Apple Event. Applescript compitió para atraer la atención de los desarrolladores con otras nuevas tecnologías que fueron lanzadas al mismo tiempo (Baloon help, Publish and Subscribe, etc.). Para algunas de las aplicaciones, Applescript fue la tecnología más difícil de implementar, requiriendo que se reescribieran grandes porciones de código de bajo nivel de las mismas, e incluso el propio marco de aplicación de Apple, MacApp, no soportó los Apple Events durante algún tiempo.
El lanzamiento fue en octubre de 1993 como parte del sistema 7.1.1 (La primera gran actualización del sistema 7). QuarkXPress (Versión 3.2) fue una de las primeras grandes aplicaciones que soportó Applescript, y como resultado, Applescript fue ampliamente adoptado en los segmentos de publicación del mercado de Apple. Aunque es discutible, la razón por la cual la plataforma Mac se mantuvo como líder de mercado tras la publicación de QuarkXPress y otras aplicaciones para la plataforma Microsoft Windows, fue que era la única que soportaba la automatización de flujos de trabajo complejos.
El paso hacia Mac OS X y su marco Cocoa ha significado una mejor implementación de Applescript. Las aplicaciones Cocoa ofrecen compatibilidad con Applescript de forma básica sin ningún esfuerzo por parte del desarrollador, y pueden alcanzar niveles profundos de compatibilidad con un poco de inversión de tiempo del desarrollador. AppleScript Studio, publicado con Mac OS X 10.2, permite a los usuarios programar aplicaciones enteras usando Applescript y objetos Cocoa.

## Conceptos Básicos

Applescript fue concebido principalmente como un lenguaje de programación de scripts, ofreciendo a los usuarios una herramienta inteligente de control y permitiendo la comunicación entre diferentes aplicaciones.
Los sistemas anteriores al sistema 7 poseían un modelo rudimentario de Evento con el que se podían ejecutar un número fijado de eventos de bajo nivel, como "tecla pulsada" o "botón de mouse pulsado". Cada aplicación era responsable de la gestión y traducción a acciones de alto nivel que tuvieran algún sentido para el usuario, como "Ejecutar la opción de menú Pegar". En muchos casos, el mismo evento contenía tanto el concepto de acción (hacer clic) como las instrucciones para su ejecución (cuando se haga clic, ejecutar la opción Pegar).
La implementación de Applescript requirió al desarrollador la separación de la acción de la ejecución, un trabajo al que Apple se refirió como "Factoring". Los programadores fueron animados a escribir dos maneras distintas de manejo de los eventos, una para el manejo de eventos de bajo nivel (clics, pulsaciones de teclas, etc.) y otra para eventos de alto nivel (Apple Events).

## Applescript en Mac OS X

En Mac OS X, Applescript es mucho más sencillo de implementar para los desarrolladores, particularmente para las aplicaciones desarrolladas en Cocoa. A diferencia de Mac OS donde los eventos son procesados por las aplicaciones, bajo Cocoa los eventos son transformados a una instrucción de alto nivel por el objeto NSApplication, y luego dirigido a un objetivo correcto. Esto significa que todas las aplicaciones de Cocoa llevan el "Factoring" hecho, el programador normalmente no escribe nada sobre el manejo del evento y solamente debe escribir cómo responderá la aplicación a los procesos que el evento solicite.
Otra importante ventaja es que los objetos Cocoa se nos presentan como estándares de manera que todos pueden acceder a ellos directamente. Bajo Cocoa, Applescript es mucho más "ligero"; el motor de scripts interpreta el script, traduce los nombres de objeto a su formato interno y luego los manda a la aplicación objetivo. los conceptos ttecnologics que son? son necesidad,clasificación ect.

## La metáfora del "Lenguaje natural"

Mientras que los Apple events son una manera de enviar instrucciones a las aplicaciones, Applescript es un lenguaje específico para generar Apple events. Manteniendo la tradición de Mac OS de sencillez de uso, el lenguaje Applescript está diseñado basándose en la metáfora del "lenguaje natural", de la misma manera que GUI está apoyado en la metáfora de escritorio. Los programas de Applescript son generalmente leíbles y editables por cualquiera. Está basado en el lenguaje HyperTalk de HypeCard, y mejorado para que no solo pueda referirse al mundo de éste, sino que teóricamente puede referirse a cualquier documento. Para este fin, el equipo de Applescript introdujo el nuevo AppleEvent Object Model (Modelo de objetos AppleEvent o AEOM), el cual definía los objetos que cualquier aplicación conocía.
Generalmente AEOM definía un número determinado de objetos, como "documento" o "párrafo" y acciones que se podían hacer con ellos, como "cerrar" o "copiar". El sistema también definía las maneras de referirse a las propiedades de los objetos, de manera que se pudiera señalar al "tercer párrafo del documento 1", o al "color de la última palabra de la ventana activa". AEOM utiliza un diccionario para asociar los Apple Events a objetos comprensibles por las personas, permitiendo la traducción en ambos sentidos entre Applescript y los Apple Events. Para saber que elementos de una aplicación pueden ser objeto de scripts, se pueden consultar dichos diccionarios (en Xcode y el editor de scripts, por ejemplo).

## Sintaxis
### Hola Mundo

El típico Hola Mundo se escribe en AppleScript con el siguiente código:
El resultado obtenido al ejecutar el script es una nueva ventana como la que aparece en el margen.

### Comentarios

Hay dos tipos de comentarios en AppleScript:
* La sintaxis (* cuerpo del comentario *) permite escribir comentario en múltiples líneas.
* El indicador -- sirve para escribir comentarios de una sola línea.
Adicionalmente también podemos iniciar el script con la línea #!/usr/bin/osascript para poder ejecutar el archivo de texto como un ejecutable de Unix.

### Variables y tipos de datos

Las variables no necesitan ser declaradas y no están fuertemente tipadas. Para asignar a una variable un valor determinado se pueden usar dos métodos:
El nombre de las variables no es sensible a mayúsculas, por lo tanto mivariable y MiVariable son equivalentes. Los nombres de las variables pueden contener letras de la a a la z, excluyendo la ñ, números y el carácter _.
Los tipos básicos en AppleScript son:
* Número
* Texto: Es una serie de caracteres Unicode
* Registros: es un conjunto ordenado de etiquetas con un valor asociado.
* Lista: Es un conjunto ordenado de valores, no necesariamente del mismo tipo.
Ejemplos de estos tipos son:
Los tipos de datos se pueden cambiar para ello se usa:
El valor que devuelve esta expresión es la representación de tipo tipoFinal del valor valorDeTipo1. Por ejemplo:

### Funciones

Las declaraciones de funciones en AppleScript, llamadas handlers, pueden tener varias formas:
Se puede cambiar la palabra for por una de las siguientes : about, above, against, apart from, around, aside from, at, below, beneath, beside, between, by, for, from, instead of, into, on, onto, out of, over, since, thru (o through), under. Se pueden definer funciones con múltiples parámetros, usando para ello varias de las palabras listadas anteriormente, distintas para cada parámetro.
Las llamada a las funciones se puede hacer con los parámetros en distinto orden al declarado:
Las funciones se pueden declarar también con parámetros posicionales:
Para que la función no necesite parámetros se escriben solamente los paréntesis, sin nombres entre ellos. También se pueden definir las funciones cambiando el on por to

#### Funciones especiales

Cuando se guarda un script como aplicación hay 4 funciones que se pueden declarar para que esta tenga ciertos comportamientos:
Run
Es la función que se llama automáticamente al ejecutar un script o al lanzar un script guardado como una aplicación. Se puede definir de dos maneras:
* Si en el script hay escritas varios comandos, sin que estos estén dentro de declaraciones de funciones o de objetos script, la función run está ya declarada implícitamente.
* Se puede definir explícitamente como una función cualquiera, aunque entonces no puede haber comandos fuera de declaraciones de funciones o de objetos script.:
    El parámetro args es opcional y sirve para pasar parámetros al inicio, por ejemplo ejecutándolo desde la línea de comandos.
Open
El script recibe la orden de ejecutar la función open cuando el usuario arrastra archivos hasta el icono de la aplicación, pasándole como argumento una lista de alias a los archivos arrastrados.
Idle
Al guardar como aplicación se puede seleccionar la opción Dejar abierto. Esto hace que cada 30 segundos, por defecto, se mande a la aplicación la orden de ejecutar la función idle. El tiempo que pasa entre las llamadas a la función se puede cambiar con el valor que devuelve la función: tiene que ser un entero y representa el tiempo en segundos entre llamadas, para el valor por defecto se devuelve 0.
Quit
La función quit es llamada cuando la aplicación recibe la orden de cerrarse. Si durante la ejecución aparece el comando continue quit se sale de la aplicación, pero, si se encuentra un return o la función acaba antes de encontrarlo, no se cierra la aplicación.
En este caso solo se saldría de la aplicación si condicion es verdadero.

### Estructuras
#### Condicionales

Al igual que en otros lenguajes de programación hay dos tipos de sentencias condicionales:

#### Bucles

Hay varios tipos de bucles:
* Bucles que no evalúan una condición:
* Bucles que evalúan una condición:
* Bucles que iteran con una variable

#### Bloque tell

El bloque tell tiene dos variantes:
El bucle tell ejecuta las sentencias de acuerdo a las funciones y propiedades definidas en el objeto destino. Este último puede ser de tipo application, document o de tipo script, normalmente definido por el usuario, entre otros.
Por ejemplo se puede utilizar para abrir una nueva ventana del Finder:

### Tratamiento de errores

Cuando se produce un error durante la ejecución de un script se para el proceso. Para evitarlo y poder continuar con la ejecución se usa el siguiente código:
Cuando aparece un error se pasa a error un texto que describe el error,descripción, y un número que identifica el tipo de error, n. Por ejemplo al ejecutar el código:
La descripción del error es "No es posible convertir "test" en tipo boolean." y el número de error es -1700
También se pueden usar sentencias para marcar un error, lo que para la ejecución del código a no ser que esté dentro de bloque try. La sintaxis es la siguiente:

## Software
### Software para editar AppleScript

* Xcode: Permite editar scripts como archivos de texto y tiene una plantilla definida para crear aplicaciones escritas en AppleScript.
* Editor AppleScript: viene incluido en Mac OS X y permite editar script y guardarlos como aplicaciones independientes, script compilados o ficheros de texto. También permite ver las funciones y propiedades definidas en las aplicaciones que se pueden controlar mediante AppleScript.
* Existen varios comandos para la Terminal de Mac OS X que permiten ejecutar scripts:
** osascript ejecuta un script: osascript rutaAlScript O una sentencia: osascript -e sentencia
** osacompile compila un script creando un archivo con extensión «.scpt»: osacompile rutaAlScript

### Software controlable mediante AppleScript

La mayoría de aplicaciones desarrolladas por Apple pueden ser manejadas con AppleScript, por ejemplo:
* Finder
* iTunes
* Xcode
* Safari