当前位置: 首页 > 后端技术 > Java

用java写一个lisp解释器(11实现import和export关键字)

时间:2023-04-01 21:53:30 Java

背景在看segmentfault文章的时候,突然想到之前已经实现了import和export关键字。import和export把多个文件组合成一个大系统是个利器,之前因为想用lisp写一个mips指令集解释器才意识到这一点(核心代码写完了,没空继续测试和改进它。在这里挖了一个洞)。文本导入,顾名思义,就是用来导入的这里我们定义它的格式:(import(abc)from'xx.lisp')export是用来导出的,我们定义它的格式如下:(exportabc)这里是用宏实现,import和export是同一种语法糖,是对load和dict导出宏功能的一层包装:(define-macroexport(lambda(.exports)(`(dict(list,@(mapsymbol->stringexports))(list,@exports)))))importmacrofunction:(define-macroimport(lambda(namesformfile)((defineexport-info(loadfile))(`(,@(map(lambda(n)(`(define,n,(dict-getexport-info(symbol->stringn)))))names))))))一共7行代码实现了一个简单的引用变量和导出变量的功能后记为什么要使用宏函数而不是函数实现是因为函数中定义的变量作用域在函数内部,而宏函数定义了一组表达式,绑定到变量执行后的作用域,也就是当前宏函数的作用域,也就是说如果在函数中使用import导入变量,导入的变量只在函数内部作用域及其子域内生效。