【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 (\