之前有网友提到写Lisp,我也挺感兴趣的,最近写了一个,主要参考Practical Common Lisp和Successful Lisp这两本书,读到哪实现到哪。
求值和解析实现了,特性方面是包括let binding,宏,函数,lambda,quote/backquote,for,if等等,剩下就是逐步完善特殊操作符,我会尽可能将两本书里提到的都搞完,最后,兔年新年快乐~
https://github.com/y1yang0/steed
p.s. 读到宏的时候,我的第一版宏展开实现是源码替换,实现完之后,我其实很困惑为啥需要宏的if还需要backquote:
(defmacro when (cond body)
`(if ,cond (block ,body))
)
(when (eq 1 4) (format "{}" "test")
when调用直接替换成if不是已经完成任务了吗?反正书上没有解答疑惑,我目前的理解是,lisp的宏展开阶段还是要求值,不是单纯源码替换,只是求值的对象变成了源码级的s-expression list,所以目前是宏展开是这样做的,目前工作良好,有懂哥可以comment。
标签:steed,自制,when,Lisp,源码,求值,实现 From: https://www.cnblogs.com/kelthuzadx/p/17061689.html