Emacs Lisp: Prográmame esta

Emacs Lisp de ahora en adelante ELisp, es un dialecto de programación inspirado en LISP (Lost In Stupid Parenthesis), con un poco de práctica puedes crear arte en código, un programa con vida propia que prácticamente programe para ti.

(Demo de msf-abbrev por BlackHat.es)

Emacs Lisp

Elisp, a diferencia de la mayoría de los lenguajes de programación usa notación polaca.

Lo que normalmente escribirías en C como una suma y asignación a una variable:

int a = 1 + 2;

Se escribe en Elisp como:

(defvar a (+ 1 2))

o asi:

(setf a (+ 1 2))

o asi:

(let (
      (a (+ 1 2))
      )
  ;; Hacer algo aqui con la variable "a"
  )

En realidad de una infinidad de formas diferentes sin necesidad definir tipos de variable ni cosas de ese tipo porque todos son el mismo tipo de dato.

Probablemente parezca muy extraño y tedioso, pero no por nada LISP ha sobrevivido mas de medio siglo reinventando la forma de programar.

La mayoría de los lenguajes de programacion buscan eficientizar el código para que se ejecute mas rápido, muchas veces sin tomar en cuenta al programador y el trabajo que a este le cueste llegar a dicho resultado.

No discuto las capacidades computacionales de lenguajes como C o Fortran, pero si necesitas resolver un problema y te dan dos herramientas: una herramienta fácil de usar y otra difícil, ¿cual escoges?

(Programando Clojure (quien es también un dialecto de LISP) en Emacs)

La belleza de la familia LISP es que puedes redefinir en tiempo real las funciones o variables sin necesidad de compilar (esto lo convierte en un lenguaje asíncrono por naturaleza), creando así funciones que te ayuden a resolver esas tareas tediosas que siempre odias hacer.

(Cursores múltiples)

Puedes crear una solución de miles de formas diferentes, una solución que no este limitada por el lenguaje.

Por ejemplo el siguiente programa para resolver ecuaciones cuadráticas en base a la formula general: (esas terribles ecuaciones ax^2+bx+c=0)

(defun raices-cuadraticas (a b c)
  "Calcula las raices de una ecuacion cuadratica en base a A, B y C."
  (let ((c1 (* -1.0 (/ b (* 2.0 a))))
        (c2 (+ (* -4.0 (* a c)) (* b b))))
    (if (>= c2 0)
        (let* ((c2 (/ (sqrt c2) (* 2.0 a))))
          (x1 (+ c1 c2))
          (x2 (- c1 c2)))
      (let* ((i (/ (sqrt (* -1 c2)) (* 2.0 a)))
             (x1 (format "%s + %si" c1 i))
             (x2 (format "%s - %si" c1 i)))
        (list x1 x2)))))

Podrás notar que el calculo se divide en dos para facilitar las cosas; dada la naturaleza de los operadores matemáticos, se puede decir que:

x_{1,2}=-\frac{b\pm{\sqrt{b^2-4ac}}}{2a}=\frac{-b}{2a}\pm{\frac{\sqrt{b^2-4ac}}{2a}}

Si b^2<4ac las raíces serán complejas.

Lo puedes comprobar ejecutando para la ecuación donde a=1;b=1;c=1:

(raices-cuadraticas 1 1 1)

Deberían aparecer las raíces complejas de la ecuación. raices.png

Se pueden crear cosas mucho mas complejas, por ejemplo en electrónica se utilizan los fasores para calcular voltajes y corrientes.

La ley de ohm dice que V=IR, esto es muy bonito cuando utilizamos números reales. Si R=5\Omega y I=1 A, entonces V=5\cdot 1=5 Volts.

El problema es cuando los voltajes, corrientes y resistencias(impedancias) son números complejos(fasores):

I=\frac{V}{Z}=\frac{127}{11+6.35i}=\frac{127 \angle{0}}{12.7 \angle{30}}=10 \angle{-30}

Entonces para sumar/restar se necesita estar en forma rectangular y para multiplicar/dividir en forma polar. De modo que hay que estar cambiando constantemente entre estas dos formas para realizar operaciones, por lo que en realidad nos ayudaría mucho tener una forma más fácil de hacer estos cálculos.

Por fortuna Chris Wellons creó un DSL que nos permite trabajar con objetos. Esto me permitió a la vez crear este DSL para calculo de fasores. Lo que hace posible el calculo que se muestra arriba:

(let ((V (@! @fasor :new 127 0 'xy))
      (Z (@! @fasor :new 11 6.35 'xy)))
  (@! V :/ Z))

fasores.png

Resumen

Con Emacs Lisp puedes:

  1. Extender Emacs a tu imaginación
  2. Crear DSL(s) poderosos

Además de la libertad que te da de crear tu propio lenguaje.

Y mucho mas! Pero eso lo dejaremos para despues.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s