世界上最好的编程语言

每个程序员都有一个梦想-创建自己的编程语言。 当然,最好,最方便-不像现有的那种。 对我个人而言,修复的想法是创建一种语言,其中将绝对没有样板,该样板应尽可能短,但非常有说服力。 两年来,我一直在努力达到预期的效果,但是无论我从哪里开始,到最后,在切断所有多余的东西之后,我总会得到Lisp。 然后我想到了一个巧妙的想法-选择Lisp并按照我的想法进行改进。 为了纪念引起我注意的第一件事,该项目被命名为Sova。


为了使这种语言可以在服务器,Web和移动平台上使用,我决定使用Javascript对其进行编译,我认为Javascript只是当今最好的设计语言之一,更重要的是,它具有强大的npm生态系统, Node.js,React和React Native


在开始我们的旅程之前,为了立即引起人们对进一步阅读本文的兴趣,下面是一个有关Sova的Express应用程序文件的示例:


=-> './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') 

好吧,让我们开始...


步骤1:使用Python缩进从Lisp中拉出括号


图片
尽管这本漫画书每次让我微笑,但我完全不同意它的主要说法。 支架不美观;支架是样板。


因此,用我的奇妙语言讲的第一件事是我决定摆脱括号。 最好的解决方案是相关的缩进,就像在Python中一样。 例如,以一段这样的lisp代码为例:


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

当然,这种表达可以以不同的方式散布开来,但这并不能使我们摆脱眼神堵塞的小丑。


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

现在,让我们看看借助显着缩进在Sova中编写相同表达式的方式是多么的优雅和轻松:


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

也就是说,在Sova中,表达式a (bc) (d (ef))等同于表达式:


 a bc d ef 

步骤2:使语言简洁


在大多数编程语言中,我不喜欢的是语法没有任何意义的阻塞,而是在屏幕上放了一块样板-多余的关键字,无意义的标点符号等。 即使是普通的lisp,单词也代替了简单易懂的字符,通常也被用来表示简单的操作,就像defn


常量声明


以Java语言中的常量声明为例:


 const a = 1 

Sova是一种功能非常强大的语言,并且其中的所有变量都是不可变的,因此您无需指定其他关键字const,而是将所有内容编写简单:


 = a 1 

功能介绍


任何语言的核心要素都是功能。 如此简约,它们出现在Sova中:


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

与任何函数式语言一样,函数主体中的最后一个表达式是可返回的。 也就是说,以上已编译的JavaScript中的代码将如下所示:


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

比较和条件


Sova中的条件表达式可以有两个或一个参数。
以下是具有两个参数的条件的示例:


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

例如,在这里,在checkNumber函数中,我们按条件返回值:


 = 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) 

在编译的JavaScipt中,它看起来像:


 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)) 

馆藏


数组


任何语言的主要集合是数组。 这是数组的声明和解构在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 

在已编译的JavaScript中,它将如下所示:


 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) 

对象


第二个最重要的集合是哈希图。 在Sova中,地图的发布和解构如下所示:


 = 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 

在编译的JavaScript中,它看起来像这样:


 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) 

如果要在对象上调用方法,则有两种方法可以执行此操作。 我们可以将其称为object.method parameter1 parameter2.method object parameter1 parameter2 。 第二种方法使我们可以创建方法调用链。


导入和导出模块


汇入


您可以从其他.sv文件以及.js文件将模块导入Sova代码。 例如,在此示例中,导入了两个模块handler/index.sv data/index.jshandler/index.sv


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

在编译的JavaScript中,它看起来像这样:


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

导入JavaScript和Sova模块都可以将Sova稍微集成到现有的Javascript项目中。


汇出


在此示例中,该函数从模块中导出:


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

在编译的JavaScript中,它看起来像这样:


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

使用范例


要查看Sova的所有美丽,通风和简洁,您需要查看一个或多或少的大型程序。 例如,这是一个程序,用于计算人的平均年龄并查找其年龄最接近平均年龄的人的姓名。


 =-> '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 

由于该语言是用JavaScript编译的,因此可以在任何平台上进行开发。 例如,这是一个用于Web浏览器的React应用程序的小示例:


 =-> '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') 

在存储库中,还有用于移动平台的Express服务器和React Native应用程序的示例。


结论


因此,Sova融合了其他几种语言的优点:


  • Lisp的简单性和强大性
  • Python缩进干净
  • 运行时和JavaScript生态系统

https://github.com/sergeyshpadyrev/sova在此处提供了使用该语言的示例的编译器代码。 我将很高兴看到所有喜欢该语言概念并且希望继续努力的人都看到了知识库中的星星。 但我会立即警告您,目前这仅是一种概念证明,甚至由于缺少文档和某些功能而使用该语言也非常困难。 例如,该语言还没有异常处理,类和其他必要的东西。 运行Windows不太可能成功。


在以下步骤中,我计划补充和稳定语法,重写语法分析器,为语法分析器和翻译器编写测试,编写文档。 同时,感谢您的关注,并很快再见。

Source: https://habr.com/ru/post/zh-CN451422/


All Articles