lisp代码合并_【Lisp系列】大功告成

本文介绍了使用C++实现LISP解释器时遇到的闭包和垃圾回收(GC)问题。作者详细阐述了如何处理闭包的环境引用,以及GC在lambda表达式中的应用。通过测试用例展示了LISP代码如`zip`、`riff-shuffle`等功能的实现,并讨论了不可变特性和内存池对性能的影响。文章结尾提到未来将尝试使用cliblisp做更多实验,如作为胶水语言、模拟操作系统等。
摘要由CSDN通过智能技术生成

【18/10/25更新】

添加测试用例:apply和Y-combinator

注意:GC默认值为32768blocks=512KB,定义位于cvm.h中的VM-MEM宏,当下列图片中的((Y Y-fib) 5)修改为((Y Y-fib) 10)时,程序会报错,这是因为GC没有足够的内存,这里你可以令VM-MEM=1024*1024便没有问题。apply和Y-combinator

42个测试用例中有一个失败,因为我还没未实现溢出判断和大数机制,因此无法表示fact(50)。

需要注意的是,控制流if的两个出口和函数定义表达式"\"的参数均为quote表达式,这样设计也是为了方便解析,同时它自动就实现了递归功能。

设置cvm.h文件中的SHOW_ALLOCATE_NODE宏为1即可开启debug输出模式。

从日志中看GC的效果

初始情况:GC大小约为32768个block,每个block为16B,则GC总容量为512KB。

当运行到最后一个用例 TEST #42后,未GC时,GC块余量9603,即程序此时占内存362KB,超过GC总容量的一半了。

当GC过后,GC余量31883 blocks,即此时只占用内存13.8KB,可以看到占用非常小。

由于LISP实现机制中运用了不可变特性和传递拷贝的特性,因此在运行中会消耗掉很多内存,因此这里尚有优化空间。

下面列出最后几则用例的代码:

TEST(R"(def `combine (\

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值