stringtranslate.com

Magik (lenguaje de programación)

Magik es un lenguaje de programación orientado a objetos que admite herencia múltiple y polimorfismo , y está tipado dinámicamente . Fue diseñado e implementado en 1989 por Arthur Chance de Smallworld Systems Ltd. como parte del Sistema de Información Geográfica (GIS) de Smallworld. Tras la adquisición de Smallworld en 2000, Magik ahora es proporcionado por GE Energy , todavía como parte de su plataforma tecnológica Smallworld.

Magik (Inspirational Magik) se introdujo originalmente en 1990 y se ha mejorado y actualizado a lo largo de los años. Su versión actual es la 5.2.

En julio de 2012, los desarrolladores de Magik anunciaron que estaban en proceso de portar el lenguaje Magik a la máquina virtual Java . La exitosa portabilidad fue confirmada por Oracle Corporation en noviembre del mismo año. [1]

Similitudes con Smalltalk

Magik comparte algunas similitudes con Smalltalk en términos de sus características de lenguaje y su arquitectura: el lenguaje Magik se compila en códigos de bytes interpretados por la máquina virtual Magik . La máquina virtual Magik está disponible en varias plataformas, incluyendo Microsoft Windows , varias versiones de Unix y Linux .

Magik se basa en la consola y el código se puede modificar sobre la marcha incluso cuando se está ejecutando una aplicación. La consola también se puede utilizar para ejecutar el código de Magik y ver los resultados.

El código compilado se almacena en un único archivo llamado archivo de imagen. Cada archivo de imagen contiene los códigos de bytes compilados y el estado de la sesión (por ejemplo, los valores de las variables) cuando se guardó la imagen por última vez.

Características del lenguaje

Comentarios

Magik usa el #token para marcar secciones de código como comentarios:

#Esto es un comentario.

Tareas

Magik utiliza el <<operador para realizar asignaciones :

 un << 1.234 b << b + a c << "foo" + "bar" # Concatenar cadenas

Para mayor claridad, esta notación se lee como "a se convierte en 1,234" o "b se convierte en b más a". Esta terminología separa la asignación de la comparación .

Magik también admite una variación comprimida de este operador que funciona de manera similar a las que se encuentran en C :

 b +<< a # Equivale a b << b + a

Para imprimir una variable puedes utilizar el siguiente comando

a << "hola" escribir(a)

Símbolos

Además de los tipos de datos convencionales, como números enteros, flotantes y cadenas, Magik también implementa símbolos. Los símbolos son un tipo de datos de token especial que se utilizan ampliamente en Magik para identificar objetos de forma única. Se representan mediante dos puntos seguidos de una cadena de caracteres. Los símbolos se pueden escapar utilizando el carácter de barra vertical . Por ejemplo:

 a << :hello # siempre que se encuentra :hello, es la misma instancia b << :|hola mundo|

Tipificación dinámica

Las variables de Magik no tienen tipos definidos como en C# y pueden hacer referencia a diferentes objetos en tiempo de ejecución. Todo en Magik es un objeto (no existe distinción entre objetos y tipos primitivos como los números enteros):

 a << 1.2 # se asigna un número de punto flotante a la variable 'a' a << "1.2" # más adelante, se asigna una cadena a la variable 'a'
Objetos

Los objetos se implementan en Magik mediante ejemplos. Los ejemplos tienen similitudes con las clases en otros lenguajes de programación como Java , pero con diferencias importantes. Magik admite herencia múltiple y mixins (que implementan funcionalidad sin datos). Las nuevas instancias se crean clonando una instancia existente (que normalmente será el ejemplo, pero no tiene por qué serlo).

Los nuevos ejemplares se crean utilizando la declaración def_slotted_exemplar(), por ejemplo:

 def_slotted_exemplar(:mi_objeto, { {:ranura_a, 34}, {:slot_b, "hola"} }, {:objeto_padre_a, :objeto_padre_b})

Este fragmento de código definirá un nuevo ejemplar llamado my_objectque tiene dos ranuras (o campos) llamados slot_a(preinicializado a 34) y slot_b(preinicializado a "hola") que hereda de dos ejemplares existentes llamados parent_object_ay parent_object_b.

Comparación

Magik implementa todos los operadores lógicos habituales ( =, <, <=, >, >=, ~=/<>) para comparación, así como algunos operadores inusuales. Los operadores _isy _isntse utilizan para comparar instancias específicas de objetos o referencias de objetos en lugar de valores.

Por ejemplo:

 a << "hola" b << "hola" a = b # devuelve Verdadero (_true) porque los valores de a y b son iguales a _is b # devuelve Falso (_false) porque a no es la misma instancia que b a << "hola" b<<a a = b # devuelve Verdadero (_true) porque los valores de a y b son iguales a _is b # devuelve True (_true) porque a b se le asignó la instancia específica del mismo objeto que a, en lugar del valor de a.

Métodos

Los métodos se definen en los ejemplos utilizando las declaraciones _methody _endmethod:

 _metodo mi_objeto.mi_metodo(a, b) _devuelve a + b _método final

Es una convención proporcionar dos métodos new()(para crear una nueva instancia) y init()(para inicializar una instancia).

 # Nuevo método _método persona.nuevo(nombre, edad) _return _clone.init(nombre, edad) _método final # Inicializar método. _método privado persona.init(nombre, edad) # Llame a la implementación principal. _super.init(nombre, edad) # Inicializar las ranuras. .nombre << nombre .edad << edad _regresar _yo mismo _método final

Crea _cloneuna copia física del personobjeto. La _superdeclaración permite que los objetos invoquen una implementación de un método en el ejemplar principal. Los objetos pueden hacer referencia a sí mismos mediante la _selfdeclaración. Se accede a las ranuras de un objeto y se asignan mediante una notación de puntos.

Los métodos que no forman parte de la interfaz pública del objeto se pueden marcar como privados mediante la _privatedeclaración . Los métodos privados solo pueden ser llamados por _self, _supery _clone.

Los argumentos opcionales se pueden declarar mediante la _optionaldeclaración. Magik asigna los argumentos opcionales que no se pasan al objeto especial _unset(el equivalente de null). La _gatherdeclaración se puede utilizar para declarar una lista de argumentos opcionales.

 _metodo mi_objeto.mi_metodo(_recopilar valores)  _método final

Iteración

En Magik las _whiledeclaraciones _for, _over, _loopy _endlooppermiten la iteración.

_bloquear_local s << 0_local i << 0_mientras yo <= 100_bucles + << yoyo +<< 1_fin del bucle>> a_bloque final

Aquí, _while se combina con _loop y _endloop.

 _metodo mi_objeto.mi_metodo(_recopilar valores) total << 0.0 _para un _sobre valores.elementos() _bucle total +<< un _fin del bucle _devolver total _método final m << mi_objeto.nuevo() x << m.mi_metodo(1.0, 2, 3.0, 4) # x = 10.0

Aquí values.elements() es un iterador que ayuda a iterar los valores.

En Magik, los métodos generadores se denominan métodos iteradores. Se pueden definir nuevos métodos iteradores mediante las instrucciones _itery _loopbody:

 _iter _method mi_objeto.even_elements() _para un _sobre _self.elements() _bucle _si a.par? _es _verdadero _entonces _cuerpo de bucle(a)  _finsi _fin del bucle _método final

Procedimientos

Magik también admite funciones llamadas procedimientos. Los procedimientos también son objetos y se declaran mediante las instrucciones _procy _endproc. Los procedimientos se asignan a variables que luego pueden invocarse:

 mi_procedimiento << _proc @mi_procedimiento(a, b, c) _devuelve a + b + c _fin del proceso x << mi_procedimiento(1, 2, 3) # x = 6

Expresión regular

Magik admite // sintaxis de expresiones regulares:

_si /Hola\,\s(\w)+!/.coincide?("¡Hola, Magik!") _entonces escribir("¡Conseguí una coincidencia!")_finsi

y para capturar grupos en Regex:

/sw([0-9]+)-([0-9]+).*/.replace_all("sw65456-324sss", "$1") # "65456"/sw([0-9]+)-([0-9]+).*/.replace_all("sw65456-324sss", "$2") # "324"

Biblioteca HTTP

Magik admite la realización de solicitudes HTTP o HTTPS a través de la biblioteca http, consulte los ejemplos a continuación:

magikhttp << http.nuevo()magikhttp.url("https://www.google.com").get()magikhttp.url("https://www.google.com").post({"User-agent", "Bot"}, "algunos datos")

Peculiaridades del lenguaje

Debido a que Magik se desarrolló originalmente en Inglaterra, los métodos de las bibliotecas principales de Smallworld se escriben en inglés británico . Por ejemplo:

 Utilice "inicializar" en lugar de "inicializar".

Colecciones

Al igual que otros lenguajes de programación, Magik también tiene colecciones, entre las que se incluyen las siguientes:

Ejemplo de Hola Mundo

El siguiente es un ejemplo del programa Hola mundo escrito en Magik:

escribir("¡Hola mundo!")

Referencias

  1. ^ Jim Connors (5 de noviembre de 2012). "Sprinkle Some Magik on that Java Virtual Machine" ( Espolvorea algo de Magik en esa máquina virtual de Java) . Consultado el 6 de noviembre de 2012. Con esta nueva capacidad, GE Energy ha logrado alojar su entorno Magik sobre la máquina virtual de Java .

Enlaces externos