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