如何编译defun

2019-10-11
阅读 7 分钟
1.8k
在defun的语法中,第一行的字符串是这个函数的文档,可以用documentation函数获取;第二行是declaration。(不管是documentation还是declaration,也许要等到自举的那一天才能够支持了)目前只打算支持如下这般朴素的defun用法:

编译return语句

2019-09-18
阅读 5 分钟
1.7k
Common Lisp中有一个叫做return的宏,它的作用和平常在C、Java,或者Node.js里面见到的return关键字完全不一样。Common Lisp中的return用于从一个块(block)中返的,而不是从一个函数中返回。用return可以写出下面这样的代码,符号YOU-WILL-NOT-SEE-ME永远不会被打印

输出HELLO WORLD——如何编译通用的函数调用表达式

2019-08-15
阅读 5 分钟
1.7k
首先要处理一下inside-out/aux和inside-out这两个函数。之前的inside-out/aux其实一直不支持对progn的处理,需要先补充;而inside-out则可以优化一下,避免在只有一个表达式的情况下,也用progn将其包裹起来。修改后的inside-out/aux和inside-out分别如下

调用C标准库的exit函数

2019-07-10
阅读 5 分钟
1.8k
在上一篇文章中,实现了对大于号(>)的处理,那么对if表达式的编译也就是信手拈来的事了,不解释太多。在本篇中,将会讲述一下如何产生可以调用来自于C语言标准库的exit(3)函数的汇编代码。

编译大于运算符

2019-07-03
阅读 3 分钟
1.5k
原定的计划中这一篇应当是要讲如何编译if表达式的,但是我发现没什么东西可以作为if的test-form的部分的表达式,所以觉得,要不还是先实现一下比较两个数字这样子的功能吧。说干就干,我决定用大于运算符来作为例子——大于运算符就是指>啦。所以,我的目标是要编译下面这样的代码

inside-out/aux如何支持对_exit的调用

2019-06-26
阅读 4 分钟
1.4k
在上一篇文章中,新增了两个函数:inside-out以及inside-out/aux——曾经想过将inside-out/aux放到前者的函数中用labels来定义,但担心不好调试,所以剥离了出来成为一个独立的函数——inside-out基本上只是驱动了后者,真正地将嵌套表达式拆解开来的还是inside-out/aux。因此,为了让让这个编译器最终可以处理如下形式的代码

拆解嵌套的表达式

2019-06-14
阅读 3 分钟
1.7k
在上一篇文章中,jjcc2函数已经可以处理加减乘除运算表达式中的变量了。也就是说,现在它可以处理如下的代码了 {代码...} 在我的电脑上,在SLIME中依次运行下面的代码 {代码...} 会得到下列的汇编代码 {代码...} 现在所需要的,就是要实现一个功能(一般是一个函数),可以将 {代码...} 自动转换为上面所给出的progn的形...

支持四则运算中的变量

2019-06-11
阅读 3 分钟
1.5k
PS:上面的结果中的#:G564只是打印出来的时候长这个样子而已,实际地输入这段代码的话,两个#:G564其实是不同的符号,会导致未绑定的变量的错误的。

如何编译setq?

2019-06-01
阅读 4 分钟
1.9k
Common Lisp中的setq类似于其它语言中的赋值语句,它可以给一个符号对象设定一个值,类似于将一个值赋值给一个变量一样。简单起见,在jjcc2中,我会将所有的符号都作为全局的一个label来实现。也就是说,如果代码中出现了

【jjcc系列第三篇】如何编译progn

2019-05-27
阅读 2 分钟
1.6k
那要编译这种代码的话怎么办呢?一个比较直观的做法,是引入临时变量,来保存嵌套在其中的表达式的求值结果,然后再用变量来代替原本嵌套的表达式。修改后的代码可能长这个样子

支持减、乘,以及除

2019-05-23
阅读 2 分钟
1.5k
在上一篇文章中,初步搭建了一个输入Common Lisp代码,输出汇编代码的编译器的骨架,实现了二元整数的加法运算。在这个基础上,要想实现减法、乘法,以及除法就是手到擒来的事情了。只需依葫芦画瓢,补充更多的分支情况即可。

开发一个trivial的lisp编译器(一)

2019-05-17
阅读 2 分钟
3k
我已经记不清写过多少个lisp-like语言的解释器,以及编译成自制字节码的编译器了,但我想这一次依然不会是最后一个。我还记得之所以入坑写第一个解释器,是因为当时正好学了一点Common Lisp,数据结构的课本中又正好提到一种叫做广义表的数据结构,顿时觉得:“这个广义表不是正好可以表达CL中的atom和cons吗?”于是便尝...