El mejor lenguaje de programaci贸n del mundo.

Cada programador tiene un sue帽o: crear su propio lenguaje de programaci贸n. El mejor y m谩s conveniente, por supuesto, no como los existentes. Para m铆 personalmente, la idea de la soluci贸n era crear un lenguaje en el que no hubiera absolutamente nada repetitivo, que fuera lo m谩s breve posible, pero extremadamente elocuente. Durante dos a帽os he estado tratando de lograr el resultado deseado, pero donde sea que empiece, al final, despu茅s de cortar todo lo superfluo, siempre obtuve Lisp. Y entonces se me ocurri贸 una idea ingeniosa: tomar Lisp y mejorarlo de acuerdo con mis ideas. En honor a lo primero que me llam贸 la atenci贸n, el proyecto se llam贸 Sova.


Para que el lenguaje fuera de la caja funcione en el servidor, en la web y en las plataformas m贸viles, decid铆 compilarlo en Javascript, que, en mi opini贸n, no es una broma uno de los idiomas mejor dise帽ados de nuestro tiempo y, lo que es m谩s importante, tiene un poderoso ecosistema npm, Node.js, React and React Native.


Y antes de comenzar nuestro viaje, para despertar inmediatamente el inter茅s en seguir leyendo el art铆culo, aqu铆 hay un ejemplo de un archivo de aplicaci贸n Express en Sova:


=-> './database' database =-> 'express' express = application express () application.get '/' -> (request response) (response.sendStatus 200) application.get '/user/:id' -> (request response) (response.send (database.getUserById request.params.id)) application.listen 8080 -> () (console.log 'Application is listening on port 8080') 

Bueno, empecemos ...


Paso 1: Extraer par茅ntesis de Lisp usando la sangr铆a de Python


imagen
Aunque este c贸mic me hace sonre铆r cada vez que lo miro, estoy completamente en desacuerdo con su declaraci贸n principal. Los soportes no son elegantes; los soportes son repetitivos.


Por lo tanto, lo primero en mi maravilloso idioma decid铆 deshacerme de los corchetes. La mejor soluci贸n fue la sangr铆a relevante, al igual que en Python. Tomemos, por ejemplo, una pieza de c贸digo lisp:


 (* 2 (+ 1 2) (- 4 (/ 2 1))) 

Por supuesto, esta expresi贸n puede extenderse en diferentes l铆neas, pero esto no nos alivia del payaso de los ojos obstruidos.


 (* 2 (+ 1 2) (- 4 (/ 2 1))) 

Ahora veamos cu谩n elegante y aireado es posible escribir la misma expresi贸n en Sova con la ayuda de una sangr铆a significativa:


 * 2 + 1 2 - 4 (/ 2 1) 

Es decir, en Sova, la expresi贸n a (bc) (d (ef)) equivalente a la expresi贸n:


 a bc d ef 

Paso 2: haz que el lenguaje sea conciso


Lo que no me gust贸 en la mayor铆a de los lenguajes de programaci贸n fue la obstrucci贸n de la sintaxis sin nada significativo, pero ocupando un lugar en la pantalla con un texto repetitivo: palabras clave adicionales, signos de puntuaci贸n sin sentido y muchos otros. Incluso en ceceo com煤n, en lugar de caracteres simples y comprensibles, las palabras se usan a menudo para denotar operaciones simples, como la misma defn .


Declaraci贸n de constantes


Tomemos, por ejemplo, la declaraci贸n de una constante en Javascript:


 const a = 1 

Sova es un lenguaje extremadamente funcional y todas las variables son inmutables, por lo que no necesita especificar una palabra clave adicional const, pero todo est谩 escrito simplemente:


 = a 1 

Las funciones


El elemento central de cualquier lenguaje es la funci贸n. Tan minimalistas se ven en Sova:


 = addOne -> number + number 1 = doubleAndAddOne -> number = doubled (* number 2) addOne doubled console.log (doubleAndAddOne 2) 

Como en cualquier lenguaje funcional, la 煤ltima expresi贸n en el cuerpo de la funci贸n es retornable. Es decir, el c贸digo anterior en JavaScript compilado se ver谩 as铆:


 const addOne = number => { return number + 1 } const doubleAndAddOne = number => { const doubled = number * 2 return addOne(doubled) } console.log(doubleAndAddOne(2)) 

Comparaciones y condiciones


Una expresi贸n condicional en Sova puede tener dos o un argumento.
Aqu铆 hay ejemplos de condiciones que tienen dos argumentos:


 console.log ? true 1 0 console.log ? (> 2 1) 'Greater' 'Less' console.log ? (> 2 1) ? (> 1 2) 'x' 'y' 'z' 

Y aqu铆, por ejemplo, en la funci贸n checkNumber, devolvemos valores por condici贸n:


 = checkNumber -> number ? (=== number 1) (<- 'One') ? (=== number 2) (<- 'Two') ? (<= number 9) (<- 'From three to nine') 'Ten or more' console.log (checkNumber 1) console.log (checkNumber 4) console.log (checkNumber 11) 

En JavaScipt compilado, se ve as铆:


 const checkNumber = number => { if (number === 1) return 'One' if (number === 2) return 'Two' if (number <= 9) return 'From three to nine' return 'Ten or more' } console.log(checkNumber(1)) console.log(checkNumber(4)) console.log(checkNumber(11)) 

Colecciones


Matriz


La colecci贸n principal de cualquier idioma es una matriz. As铆 es como se ve la declaraci贸n y la deconstrucci贸n de la matriz en Sova:


 = list | 1 2 3 4 console.log list console.log list.map (-> x (+ x 1)) = (| first second) list console.log first console.log second 

En JavaScript compilado, se ver谩 as铆:


 const list = [1, 2, 3, 4] console.log(list) console.log(list.map(x => x + 1)) const [first, second] = list console.log(first) console.log(second) 

Objeto


La segunda colecci贸n m谩s importante es el hashmap. En Sova, el anuncio y la deconstrucci贸n del mapa se ven as铆:


 = map : a 1 b 2 c : d 3 e 4 f 'Hello' console.log map = (: a (c (: de))) map console.log a console.log d console.log e 

En JavaScript compilado, se ve as铆:


 const map = { a: 1, b: 2, c: { d: 3, e: 4 }, f: 'Hello' } console.log(map) const { a, c: { d, e }} = map console.log(a) console.log(d) console.log(e) 

Si queremos llamar a un m茅todo en un objeto, entonces hay dos formas de hacerlo. Podemos llamarlo como object.method parameter1 parameter2 o como .method object parameter1 parameter2 . El segundo m茅todo nos permite crear una cadena de llamadas a m茅todos.


Importar y exportar m贸dulos


Importar


Puede importar m贸dulos al c贸digo Sova desde otros archivos .sv , as铆 como desde archivos .js . Por ejemplo, en este ejemplo, se importan dos m贸dulos: data/index.js y handler/index.sv :


 =-> './data' (: greeting name) =-> './handler' handle handle greeting name 

En JavaScript compilado, se ve as铆:


 const { greeting, name } = require('./data') const handle = require('./handler') handle(greeting, name) 

La importaci贸n de los m贸dulos JavaScript y Sova hace posible integrar ligeramente Sova en un proyecto Javascript existente.


Exportar


En este ejemplo, la funci贸n se exporta desde el m贸dulo:


 <-= -> (greeting name) console.log greeting console.log name 

En JavaScript compilado, se ve as铆:


 module.exports = (greeting, name) => { console.log(greeting) console.log(name) } 

Ejemplos de uso


Para ver toda la belleza, la ligereza y la concisi贸n de Sova, debe mirar un programa m谩s o menos grande. Por ejemplo, aqu铆 hay un programa que calcula la edad promedio de las personas y encuentra el nombre de la persona cuya edad es m谩s cercana a la edad promedio.


 =-> 'lodash' _ = people | : (name 'Alice') (age 24) : (name 'Bob') (age 15) : (name 'Chris') (age 46) : (name 'Daniel') (age 35) : (name 'Elisabeth') (age 29) : (name 'Fred') (age 52) = averageAge / .reduce (.map people (-> man man.age)) -> (xy) (+ xy) 0 .length people = manWithClosestToAverageAge _.minBy .map people (-> man (: (name man.name) (distance (Math.abs (- averageAge man.age))))) 'distance' console.log averageAge console.log manWithClosestToAverageAge.name 

Debido al hecho de que el lenguaje est谩 compilado en JavaScript, el desarrollo para cualquier plataforma es posible. Por ejemplo, aqu铆 hay un peque帽o ejemplo de una aplicaci贸n React para navegadores web:


 =-> 'react' React =-> 'react-dom' ReactDOM =-> './styles' styles = (: createElement:e) React = App -> ((: name)) e 'div' (: (style styles.container)) e 'div' (: (style styles.hello)) 'Hello' e 'div' (: (style styles.name)) name ReactDOM.render (e App (: (name 'John'))) (document.getElementById 'root') 

Tambi茅n en el repositorio hay ejemplos de aplicaciones Express server y React Native para plataformas m贸viles.


Conclusi贸n


Por lo tanto, Sova incorpora lo mejor de varios otros idiomas:


  • la simplicidad y el poder de Lisp
  • Sangrado de Python limpio
  • tiempo de ejecuci贸n y ecosistema de JavaScript

El c贸digo del compilador con ejemplos de uso del lenguaje se encuentra aqu铆 https://github.com/sergeyshpadyrev/sova . Me alegrar谩 ver las estrellas en el repositorio de todos aquellos a quienes les gust贸 el concepto del lenguaje y quisieran continuar trabajando en 茅l. Pero inmediatamente te advertir茅 que por el momento esto es solo una prueba de concepto, e incluso jugar con el idioma debido a la falta de documentaci贸n y algunas caracter铆sticas es extremadamente dif铆cil. Por ejemplo, el lenguaje a煤n no tiene manejo de excepciones, clases y otras cosas necesarias. Y ejecutar Windows es poco probable que tenga 茅xito.


En los siguientes pasos, planeo complementar y estabilizar la sintaxis, reescribir el analizador, escribir pruebas para el analizador y el traductor, escribir documentaci贸n. Mientras tanto, gracias por su atenci贸n y hasta pronto.

Source: https://habr.com/ru/post/451422/


All Articles