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]
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.
Magik usa el #
token para marcar secciones de código como comentarios:
#Esto es un comentario.
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)
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|
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'
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_object
que 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_a
y parent_object_b
.
Magik implementa todos los operadores lógicos habituales ( =
, <
, <=
, >
, >=
, ~=/<>
) para comparación, así como algunos operadores inusuales. Los operadores _is
y _isnt
se 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.
Los métodos se definen en los ejemplos utilizando las declaraciones _method
y _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 _clone
una copia física del person
objeto. La _super
declaració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 _self
declaració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 _private
declaración . Los métodos privados solo pueden ser llamados por _self
, _super
y _clone
.
Los argumentos opcionales se pueden declarar mediante la _optional
declaración. Magik asigna los argumentos opcionales que no se pasan al objeto especial _unset
(el equivalente de null). La _gather
declaración se puede utilizar para declarar una lista de argumentos opcionales.
_metodo mi_objeto.mi_metodo(_recopilar valores) _método final
En Magik las _while
declaraciones _for
, _over
, _loop
y _endloop
permiten 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 _iter
y _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
Magik también admite funciones llamadas procedimientos. Los procedimientos también son objetos y se declaran mediante las instrucciones _proc
y _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
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"
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")
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".
Al igual que otros lenguajes de programación, Magik también tiene colecciones, entre las que se incluyen las siguientes:
El siguiente es un ejemplo del programa Hola mundo escrito en Magik:
escribir("¡Hola mundo!")
Con esta nueva capacidad, GE Energy ha logrado alojar su entorno Magik sobre la máquina virtual de Java.