目录

  1. 用javascript实现一门编程语言-前言
  2. 用javascript实现一门编程语言-语言构想
  3. 用javascript实现一门编程语言-写一个解析器
  4. 用javascript实现一门编程语言-字符输入流

关于 λanguage 的一些构想

对,我们要实现的语言就叫它 λanguage 吧。

正确的编程方式,是应该先有明确的思路和逻辑。所以我们应该把 λanguage 的语言特性罗列到这里,但是在这个教程中,我就较为随意的放几个例子来解释语言特性吧。

# 这里是注释println("Hello world");println(2 + 3 * 4);# 通过 lambda 这个关键字来声明函数
fib = lambda (n) if n < 2 then n else fib(n - 1) + fib(n - 2);println(fib(15))print-range = λ(a, b)if a <= b then {print(a);if a + 1 <= b {print(", ");print-range(a + 1, b);} else println("");}print-range(1, 5);
复制代码

你应该注意到上面的变量名称包含 - 号,这是根据个人偏好来设定的,因为作者不喜欢使用驼峰命名,也不喜欢使用下划线。自己实现一个编程语言的好处就是,你可以自定义它的语法。

上面代码的输出如下:

Hello world
14
610
1, 2, 3, 4, 5
复制代码

λanluage 可能看起来跟 javascript 很像,但是它们是不一样的。

  • λanguage 是不需要声明变量的,只有表达式
  • 一个表达式的返回值可以用在其他表达式中
  • 分号用来分割语句
  • 用花括号来创建一个块,返回值是最后一条语句的值,花括号也是一种表达式

以下的程序是合法的:

a = {fib(10); # 没有任何副作用,但是还是会执行fib(15)  # 最后一个分号可以省略
};
print(a); # 打印出 610
复制代码

函数是通过 lambda 或者 λ 来声明。在关键字的后面需要跟被括号包裹的形式参数,如

fib = lambda(num) num + 1;
复制代码

关键字后面是单句表达式,但是可以通过{}来生成一个代码块。表达式的最后一个语句的执行结果会作为返回值传给调用者。

注意没有var, 你可以通过类似javascript中的立即执行函数 (IIFE) ,来声明一个变量。可以通过 lambda 声明一个变量作为参数。 变量是术语块级作用域。函数类似于javascript中的闭包。

javascript 中的三元表达式可以写成这样:

a = foo() ? bar() : baz();  // javascript
a = if foo() then bar() else baz();  # λanguage
复制代码

在有{ 的情况下 then 关键字可以被省略,如上面的print-range。其他的都是必须的,通过else创建另一个条件分支。当表达式中 else 缺失,并且if判断为false时,if表达式将会返回 false。语言中除了false以外,都会被解析成true,包括数字0和空字符串。

注意,我们需要在每一个表达式后面用分号作为结束。


好了,这就是关于我们λanguage语言的介绍,虽然它看起来像个玩具,并且缺少很多特性,如数组、对象等,但是都是在这些的基础上展开的,如果你能很好的理解掌握我们的教程,其他的语法特性都不是问题。

原文链接: lisperator.net/pltut/dream

转载于:https://juejin.im/post/5b5ef604e51d451945585399

[译]用javascript实现一门编程语言-语言构想相关推荐

  1. 用javascript实现一门编程语言-字符输入流

    目录 用javascript实现一门编程语言-前言 用javascript实现一门编程语言-语言构想 用javascript实现一门编程语言-写一个解析器 用javascript实现一门编程语言-字符 ...

  2. javascript---001-运行原理01_前端三大技术_JS重要性_Atwood定律_JS应用_JS让人迷惑_TypeScript会取代JS吗_JS是一门编程语言_浏览器工作原理_浏览器内核

    javascript-001-运行原理01 1.前端三大技术 HTML CSS Javascript 2.Javascript的重要性 (1)javascript是很多框架的基础,Vue,React, ...

  3. 语言输出奇树有多少总方法_如何学习一门编程语言?这些方法告诉你,不要再说你不会学习...

    前言 很多人喜欢争论什么什么编程语言好,我认为这个话题如果不限定应用范围,就毫无意义. 每种编程语言必然有其优点和缺点,这也决定了它有适合的应用场景和不适合的应用场景.现代软件行业,想一门编程语言包打 ...

  4. 用 C 语言开发一门编程语言 — 字符串与文件加载

    目录 文章目录 目录 前文列表 字符串 读取字符串 注释 文件加载函数 命令行参数 打印函数 报错函数 源代码 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器> <用 C ...

  5. 用 C 语言开发一门编程语言 — 条件分支

    目录 文章目录 目录 前文列表 条件分支 排序函数 等于函数 if 函数 递归函数 源代码 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器> <用 C 语言开发一门编程语 ...

  6. 用 C 语言开发一门编程语言 — 基于 Lambda 表达式的函数设计

    目录 文章目录 目录 前文列表 函数 Lambda 表达式 函数设计 函数的存储 实现 Lambda 函数 函数的运行环境 函数调用 可变长的函数参数 源代码 前文列表 <用 C 语言开发一门编 ...

  7. 用 C 语言开发一门编程语言 — 变量元素设计

    目录 文章目录 目录 前文列表 变量 变量语法规则 变量的读取和存储 将变量加入 Lisp Value 体系 变量的计算 变量的定义与赋值 异常处理优化 源代码 前文列表 <用 C 语言开发一门 ...

  8. 用 C 语言开发一门编程语言 — Q-表达式

    目录 文章目录 目录 前文列表 Q-表达式 读取并存储输入 实现 Q-Expression 语法解析器 读取 Q-Expression 实现 Q-Expression 的函数 Head & T ...

  9. 用 C 语言开发一门编程语言 — S-表达式

    目录 文章目录 目录 前文列表 使用 S-表达式进行重构 读取并存储输入 实现 S-Expression 语法解析器 实现 S-Expression 存储器 实现 lval 变量的构造函数 实现 lv ...

最新文章

  1. 判断脚本,图片,CSS,iframe等是否加载完成
  2. 解决两台centos虚拟机Telnet服务无法联机的问题
  3. CSharp 如何OCR离线识别文本
  4. AD:使用C#批量创建帐号
  5. 《和扬哥一起从零开始学编程》免费、免费、免费
  6. 基于Easy CHM和VS的帮助文档制作
  7. SpringBoot排序之Order注解
  8. 单例设计模式,写出几个例子
  9. sam格式的结构和意义_SAM文件格式介绍
  10. 使用cocoapods导入第三方后 报错_OBJC_CLASS_$_XXX
  11. 修改opencv3.4 VideoCapture dshow模块以支持圆刚cv710等需要配置CrossBar的采集卡
  12. PowerMill2019基础到三四五轴编程视频教程全
  13. 【Linux】【下载工具】Linux系统命令行下载工具汇总
  14. ubuntu 下载jdk1.8
  15. Jetpack新成员,Paging3从吐槽到真香
  16. 使用css和js实现鼠标拖尾特效
  17. ArcGIS:如何进行缓冲区分析(以市区选择住房位置为例)?
  18. 索尼XB950N1 震撼人心的重低音
  19. 【2014,羽翼渐丰振翅飞】
  20. 企业营运能力分析:流动资产周转率、存货周转率、应收账款周转率、固定资产周转率、总资产周转率...

热门文章

  1. 深入理解 PHP7 unset 真的会释放内存吗?
  2. React 第六章 事件的绑定
  3. AJAX简单使用介绍
  4. spark的ContextCleaner清理
  5. volatile是怎么保证可见性和有序性的,为什么无法保证原子性
  6. vuex mysql_Vue插件---Vuex(仓库,数据库)
  7. Oracle用rowid删除同一张表的重复记录
  8. 再谈strncpy函数--值得一看的好文章
  9. 在浏览器设置里能看到cookie, 页面调试Application里看不到
  10. 深入理解DDD中的聚合