Magik (lenguaje de programación) - Magik (programming language)
Magik es un lenguaje de programación orientado a objetos que admite herencia múltiple y polimorfismo , y se escribe 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 5.2.
En julio de 2012, los desarrolladores de Magik anunciaron que estaban en proceso de migrar el lenguaje Magik a la máquina virtual Java . Oracle Corporation confirmó el éxito de la portabilidad en noviembre del mismo año.
Similitudes con Smalltalk
Magik en sí comparte algunas similitudes con Smalltalk en términos de sus características de lenguaje y su arquitectura: el lenguaje de 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, incluido Microsoft Windows , varios sabores de Unix y Linux .
Magik se basa en una 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 código Magik y ver los resultados.
El código compilado se almacena en un solo 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, valores de variable) cuando se guardó la imagen por última vez.
Características del idioma
Comentarios
Magik usa el #
token para marcar secciones de código como comentarios:
# This is a comment.
Asignaciones
Magik usa el <<
operador para realizar asignaciones :
a << 1.234 b << b + a c << "foo" + "bar" # Concat strings
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 # Equivalent to b << b + a
Para imprimir una variable puede usar el siguiente comando
a << "hello" write(a)
Simbolos
Además de los tipos de datos convencionales, como 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. Están representados por dos puntos seguidos de una cadena de caracteres. Los símbolos se pueden escapar usando el carácter de barra vertical . Por ejemplo:
a << :hello # whenever :hello is encountered, it is the same instance b << :|hello world|
Escritura dinámica
Las variables de Magik no se escriben como en, por ejemplo, C # y pueden hacer referencia a diferentes objetos en tiempo de ejecución. Todo en Magik es un objeto (no hay distinción entre objetos y tipos primitivos como enteros):
a << 1.2 # a floating point number is assigned to variable 'a' a << "1.2" # later, a string is assigned to variable 'a'
- Objetos
Los objetos se implementan en Magik utilizando ejemplos. Los ejemplares tienen similitudes con las clases de otros lenguajes de programación como Java , pero con diferencias importantes. Magik admite herencia múltiple y mixins (que implementan la funcionalidad sin datos). Las instancias nuevas se crean clonando una instancia existente (que normalmente será el ejemplo, pero no tiene por qué serlo).
Se crean nuevos ejemplos utilizando la declaración def_slotted_exemplar()
, por ejemplo:
def_slotted_exemplar(:my_object, { {:slot_a, 34}, {:slot_b, "hello"} }, {:parent_object_a, :parent_object_b})
Este fragmento de código definirá un nuevo ejemplar llamado my_object
que tiene dos ranuras (o campos) llamados slot_a
(preinicializados en 34) y slot_b
(preinicializados en "hola") que hereda de dos ejemplos existentes llamados parent_object_a
y parent_object_b
.
Comparación
Implementos Magik todos los operadores lógicos habituales ( =
, <
, <=
, >
, >=
, ~=/<>
) para la comparación, así como algunos más inusuales. Los operadores _is
y _isnt
se utilizan para comparar instancias específicas de objetos o referencias a objetos en lugar de valores.
Por ejemplo:
a << "hello" b << "hello" a = b # returns True (_true) because the values of a and b are equal a _is b # returns False (_false) because a is not the same instance as b a << "hello" b << a a = b # returns True (_true) because the values of a and b are equal a _is b # returns True (_true) because b was assigned the specific instance of the same object as a, rather than the value of a.
Métodos
Los métodos se definen en ejemplos utilizando las declaraciones _method
y _endmethod
:
_method my_object.my_method(a, b) _return a + b _endmethod
Es una convención proporcionar dos métodos new()
(para crear una nueva instancia) y init()
(para inicializar una instancia).
# New method _method person.new(name, age) _return _clone.init(name, age) _endmethod # Initialise method. _private _method person.init(name, age) # Call the parent implementation. _super.init(name, age) # Initialise the slots. .name << name .age << age _return _self _endmethod
El _clone
crea 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 ejemplo 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
instrucción. Los métodos privados sólo pueden ser llamados por _self
, _super
y _clone
.
Los argumentos opcionales se pueden declarar usando 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.
_method my_object.my_method(_gather values) _endmethod
Iteración
En el Magik _while
, _for
, _over
, _loop
y _endloop
declaraciones permiten iteración.
_block _local s << 0 _local i << 0 _while i <= 100 _loop s +<< i i +<< 1 _endloop >> s _endblock
Aquí, _ while se combina con _loop y _endloop.
_method my_object.my_method(_gather values) total << 0.0 _for a _over values.elements() _loop total +<< a _endloop _return total _endmethod m << my_object.new() x << m.my_method(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 del generador se denominan métodos iteradores. Se pueden definir nuevos métodos de iterador usando las declaraciones _iter
y _loopbody
:
_iter _method my_object.even_elements() _for a _over _self.elements() _loop _if a.even? _is _true _then _loopbody(a) _endif _endloop _endmethod
Procedimientos
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:
my_procedure << _proc @my_procedure(a, b, c) _return a + b + c _endproc x << my_procedure(1, 2, 3) # x = 6
Expresión regular
Magik admite // sintaxis de expresiones regulares:
_if /Hello\,\s(\w)+!/.matches?("Hello, Magik!") _then write("Got a match!") _endif
y 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.new() magikhttp.url("https://www.google.com").get() magikhttp.url("https://www.google.com").post({"User-agent", "Bot"}, "some data")
Peculiaridades del lenguaje
Debido a que Magik se desarrolló originalmente en Inglaterra, los métodos en las bibliotecas centrales de Smallworld se escriben en inglés británico . Por ejemplo:
Use "initialise", not "initialize".
Colecciones
Al igual que otros lenguajes de programación, Magik también tiene colecciones. Incluyen lo siguiente:
- Vector simple
- Cuerda
- Tabla de picadillo
- Lista de propiedades
- Conjunto de igualdad
- Pantalón
Ejemplo de Hello World
El siguiente es un ejemplo del programa Hola mundo escrito en Magik:
write("Hello World!")
Referencias
enlaces externos
- Tecnología Smallworld Product Suite
- MDT - IDE de herramientas de desarrollo de Magik para desarrolladores de GIS de GE Smallworld
- Código abierto (SourceForge)
- Publicación en el foro de idiomas en Magik
- Documento técnico n. ° 5: una descripción general de Smallworld Magik
- GE Smallworld, extensiones de Emacs para desarrolladores de Magik
- Extensión de Visual Studio Code para el lenguaje de programación Smallworld Magik.