背景
翻看segmentfault 文章的时候突然想到了之前好像实现过 import 和export 关键字,
import 和 export 是将多文件组合成大型系统的一个利器,然后之前实现这个也是因为想用lisp写一个 mips 指令集解释器(核心代码写完了,后面没有空就没有在继续测试与完善,此处挖了一个坑)
正文
import 顾名思义 用来导入用的
这里我们定义一下他的格式:
(import (a b c) from 'xx.lisp')
export 用来导出用的
我们定义他的格式如下:
(export a b c)
此处用宏实现, import和export本身是一种语法糖,是对load与dict的一层包装
export 宏函数:
(define-macro export(lambda (. exports) (
` (dict (list ,@(map symbol->string exports)) (list ,@exports))
)))
import 宏函数:
(define-macro import(lambda (names form file)(
(define export-info (load file))
(`(,@(map (lambda (n) (`(define ,n ,(dict-get export-info (symbol->string n))))) names)))
)))
总共7行代码实现了一个简单的 引用变量 导出变量的功能
后记
关于为什么要用宏函数而非函数实现,是因为函数里面定义的变量的作用域是函数内部,而宏函数定义的是一组表达式在被执行后变量绑定的作用域是当前宏函数所在的的作用域,也就是说如果你在函数里面使用 import导入变量的话,那被导入的变量仅在函数内部作用域及其子域生效。