重构vertical-let,支持解构

2020-02-12
阅读 3 分钟
1.2k
《实战Common Lisp》系列主要讲述在使用Common Lisp时能派上用场的小函数,希望能为Common Lisp的复兴做一些微小的贡献。MAKE COMMON LISP GREAT AGAIN。

提升条目为第一个孩子节点

2020-02-11
阅读 1 分钟
1.8k
“实战Elisp”系列旨在讲述我使用Elisp定制Emacs的经验,抛砖引玉,还请广大Emacs同好不吝赐教——如果真的有广大Emacs用户的话,哈哈哈。

all-first-registers-to-strings

2020-01-25
阅读 2 分钟
1.3k
本文是《实战Common Lisp》系列的第一篇文章。本系列主要讲述在使用Common Lisp时能派上用场的小函数,希望能为Common Lisp的复兴做一些微小的贡献。

快速设置任务的开始时间(上)

2020-01-09
阅读 2 分钟
2k
本文是“实战Elisp”系列的第一篇。本系列旨在讲述我使用Elisp定制Emacs的经验,抛砖引玉,还请广大Emacs同好不吝赐教——如果真的有广大Emacs用户的话,哈哈哈。

2019年总结

2020-01-02
阅读 4 分钟
2.6k
在18年的总结中,我提到自己开发了一个名为cuckoo的工具,用来代替macOS的提醒事项、日历,以及由crontab调用的shell脚本。这个目标在19年得以实现,cuckoo已经完全取代了它们。

当我们git merge的时候到底在merge什么

2019-12-21
阅读 4 分钟
6.3k
我在上大学的时候并没有接触过VCS(版本控制系统)。虽然曾经在Google Code发布过去项目,但是以压缩包的形式发布的;与室友合作开发计算机网络这门课的课程设计时,也没有用上。直到入职第一家公司后才真正开始使用,当时用的是Git,此后也始终没用过其它的VCS——SVN仅仅耳闻未曾使用——转眼间已经用了六年多的Git了。

一些适用于Node.js的命名约定

2019-12-07
阅读 3 分钟
5.1k
There are only two hard things in Computer Science: cache invalidation and naming things.-- Phil Karlton

带你见识一下传说中的Emacs

2019-11-21
阅读 6 分钟
6.1k
本文通过与VSCode作对比,来简单地介绍Emacs的基本功能、特点,以及一些插件。本文所说的Emacs指的是GNU Emacs,下文简称Emacs。 基本概念 Emacs是一个文本编辑器,就像VSCode那样。它可以用来写代码、Markdown,以及其它任何纯文本; 在Emacs中打开的每个文件都有一个“主模式”(major mode),就像在VSCode中每个文件都...

将二叉树写到磁盘上

2019-10-29
阅读 6 分钟
4.3k
有一阵子很好奇一个问题:MySQL到底是如何将内存中的B+树写入到磁盘文件中的。明明是一棵树,要怎样才能存储成线性的字节流呢?干脆自己动手,试着实现一个简单的版本,来帮助自己摸点门道。虽然想法很不错,不过一上来就面对噩梦级别的B+树也太为难人了,因此就先从简单的二叉树入手吧。

在Emacs中搭建笔记查阅系统的尝试

2019-10-20
阅读 4 分钟
2.1k
给Emacs写插件有种痛并快乐着的感觉。虽然这个发挥创意的过程很有趣,但是Elisp写起来总有种别扭的感觉。一方面,我把它当成是Common Lisp,写的时候没有觉得“这个用法可能会有问题”;另一方面,它又不是普通的写lisp代码,还要一边写一边摸索Emacs中的一些概念。不过总体而言,还是挺好玩的,除了没有一个像模像样的REP...

如何编译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-18
阅读 2 分钟
2.7k
我司在做一些咋看之下比较复杂的需求的时候,都需要先写设计文档,不过我猜想这种规矩应该在很多公司都有才对,我并没有其它公司没有这种规矩的言外之意。然后呢,我个人比较习惯按照“从外到内”的方式来写设计文档,因此,在文档的开篇我总是会描述一下一个需求的全局视图,一般来说,就是用绘图的方式。对于一些复杂的...

拆解嵌套的表达式

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吗?”于是便尝...

Boostnote及对记笔记的思考

2019-05-07
阅读 3 分钟
6.6k
有一阵子,我沉迷于“笔记软件狩猎”中——就是不停寻找各种各样的笔记软件,再一个个试用,企图从中选出一个最强大的。回想起来,我尝试过有道云笔记、印象笔记、Quiver、Boostnote、OneNote、Yu Writer、Leanote(在本地搭建),等等。大部分都是浅尝辄止,例如OneNote,当我发现它不支持代码块语法高亮时,就放弃了它。目...

更过程式的let——vertical-let

2019-03-13
阅读 2 分钟
1.7k
作为一名自诩的non-trivial的Common Lisp程序员,在编码的时候经常会遇到令人不愉快的地方,其中一个便是LET。 一段典型的LET的示例代码如下 {代码...} 大多数时候,LET不会只有一个绑定。并且,也不会只是绑定一个常量这么简单,而应当是下面这样的 {代码...} 有时候我会想看看某一个绑定的值——最好是在它计算完毕后立...

不同工具查看代码分支diff的差异

2019-02-28
阅读 2 分钟
21.9k
当使用Emacs时,我更喜欢用M-x package-install安装的magit提供的功能——magit-diff,而不是它自带的vc-dir。按下M-x,输入magit-diff并敲下回车后,Emacs会在minibuffer中等待用户输入要比较的分支。就像在shell中使用git-diff一样,只需要输入两个以..连接的分支名并敲下回车,就可以列出它们间的差异。如下图所示

拿Emacs对接我的cuckoo

2019-02-05
阅读 4 分钟
2.3k
cuckoo是一个我自己开发的类似待办事项的工具,运行在我本地的电脑上。它有如下两个接口: 传入一个UNIX Epoch时间戳创建提醒 传入一个标题以及提醒的ID来创建任务 这样一来,便能在设定的时刻调用alerter在屏幕右上角弹出提醒。 我喜欢用Emacs的org-mode来安排任务,但可惜的是,org-mode没有定点提醒的功能(如果有的...

Project-Euler第69题

2019-01-28
阅读 3 分钟
1.3k
大学的时候挺喜欢解Project Euler上的题目的,尤其是它不在乎答题者使用哪一门编程语言,甚至还有很多参与者是使用pen&paper来解题的。去年开始重新开始做Project Euler上的题目,而第69题则是最近刚刚解决的一题。惭愧的是,因为不晓得欧拉函数的计算公式(甚至都没有想过欧拉函数有没有可以用来计算的公式),所以...

一些在Emacs中搜索文本的方法

2019-01-11
阅读 2 分钟
4.1k
在Emacs中写代码的时候,常常需要查找一个函数、方法,或者变量的定义。如果是正在写Common Lisp,那么SLIME已经配置好了相应的快捷键M-.,只需要将光标移动到要查看的函数、方法,或者变量的名字上,按下M-.便可以跳转过去——再按一下M-,还能回到原来的位置。

Emacs的org-mode实现自动的internal archive

2019-01-07
阅读 2 分钟
3.2k
org-mode是一个Emacs内置的major mode,当打开一个后缀为.org的文件时就会被启用。在官网的介绍中提到,它可以用于管理待办事项,而这也正是我目前使用org-mode最多的场合。比如,我用它来记录漫画的阅读进度,每一话或每一章就是一个标记了TODO关键字的条目,读完那一话或那一章后就会将对应的条目标记为DONE。一般我会...