!!! still testing !!!
1. add data section of function
   之后才能实现按 ":" 这个语法关键词
   #+begin_src cicada
   : kkk
     1 2 3 . . .
       : aaa
         4 5 6 . . .
         Exit
       ; define-function
     aaa
     Exit
   ; define-function

   每次调用到 kkk 的时候 都会重新编译一个 aaa 到字典中

   编译的结果是:
   可以发现 同对 lambda 的处理一样 还是几乎线性的

   _literal 1
   _literal 2
   _literal 3
   . . .
     _literal address
     _literal length
     define-function
   aaa
   Exit

   string:
   aaa
   4 5 6 . . .
   Exit
   ---------
   #+end_src
2. 并不必重写 字典编撰者
   它们还是处理字符串而已
   这个字符串来自哪里并不重要
   在解释语义里 ":" 会把 代表函数体的字符串储存在一个 buffer 中
   而在渐进编译的 解释器中
   这些字符串 必须被 放到新分配的 静态内存中
   也就是说 函数体必须有自己的 数据段
   并且这些数据段是
   不能被垃圾回收器处理的 纯粹静态分配的 内存
3. move "if else then" to assembly code
4. 我更改 解释器的运行方式
   使得每次在输入表达式的时候
   机器都统一地用编译语义来处理 表达式
   我想 很多语言的实现者
   正是以这种所谓的渐进编译的方法
   来实现解决这个问题的
   1) 如何实现呢?
      每一次的输入需要被当作一段函数来编译
      内存如何分配? 如何回收?
      以这种设计为基础 是否能引出有趣的性状
   2) 问题是在 REPL 中所输入的需要被解释的代码段
      通常是函数的定义
      如果要把这些代码段处理成函数
      那么最少有两个问题需要解决:
      1. 明显的 Exit 的问题
      2. 嵌套的函数体必须被处理
   3) 从这里也可以看出 ocaml 使用 ";;" 来标记表达式的原因
   4) REPL 的名字也应该变了
      read compile call loop
      注意这里紧接着 compile 的 call
      其实 只要 把 eval 理解为 compile & call
      那么就能保留 REPL 这个名字
      而 一般的语法编撰者 只是 编译而已
   5) 嵌套 在内存的 函数定义
      必须以 string 的形式储存在 外层的函数的函数体内
      每次调用的时候 都通过 eval 一个 string 来重新定义一个新的函数
   6) 嵌套的函数定义并不是没法处理
      毕竟我已经处理过 嵌套的 lambda-term 了
      并且这里的嵌套 不用递归
      即 函数体 被作为字符串 而编译到 数据段内的时候
      如果 其中 又 包含了函数体
      那么 不必处理里面的函数体
      因为 函数体中的函数体是由 字典编撰者 处理的
   7) 还有一个问题就是
      我必须形成 有独立意义的
      可以被编译成函数的代码块 之后
      才能把这段代码提交给编译器去编译
      也就是说 在某些 reader 之中的时候
      代码块 是不会被提交的
      并不需要 新的 语法来标记 代码块
   8) 为了 达到 ``不需要 新的 语法来标记 代码块'' 的效果
      我必须在每次 回车 的时候尝试提交代码
      这是无所谓的
      但是 如果有更好的 IO 环境的支持
      那么我就能把这种东西实现地更好
      在 linux 这种东西上就 先用回车 提交
      在 emacs 中 (更好地) 其实 C-j 也是回车 但是不会提交代码
      所以 emacs 是比 linux 更好的操作系统
   9) 在每次回车的时候提交代码段 并不是理想的设计
      尤其是考虑到 要在 在类似 emacs 中的环境下使用 REPL
      此时被输入的文本是可以被随意修改的
      而这种修改所带来的解释器行为的改变是不好预测的
      正确的用户接口
      应该是:
      1. 使用另外一个快捷键来作为 编译代码段的信号
      2. 并且 不允许 修改已经被读入的代码段
      要实现这些 非常难吗 ???
      我可以在 emacs 中实现这些吗 ???
      我可以在 终端中实现这些吗 ???
      emacs 中当然可以实现这种效果
      但是我不想写 elisp 代码了
   10) 关于渐进编译器的用户接口
       渐进编译器 可以维护一个匿名函数的 数组
       新定义的函数会替代最老的函数
       这样就给了引用前面的某个函数的机会
       还可以提供一些机制 来处理这个 匿名函数 的数组
   11) 渐进编译是可行的
       只要在每次 读入 代码段的时候
       补足一个 Exit 就行了
       明显的使用 Exit 就会在末尾多一个 Exit
       多一个并没有关系
       这样就 让用户可以在解释器中 输入复杂的代码段了
5. 从 input 读取 string 的工作
   全部由 渐进编译器 完成
   这可以被看作一次 factoring
   渐进编译器 需要做的是
   1) 不断的读字符串
      判断什么时候应该停止读取
   2) 停止读字符串之后
      就调用 compiler 然后 马上 call 被编译好的函数
6. let the interpreter works as a compiler