背景

翻看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导入变量的话,那被导入的变量仅在函数外部作用域及其子域失效。