Autology

一个关于 Lisp 元编程的热点,Autology 是一个可以访问自身解释器的 Lisp。

它是什么?

Autology 是一种函数式解释型 Lisp 语言,用 Clojure 编写。

Autology 解释器函数被定义为一个数据结构,该数据结构可供 Autology 程序访问,它被绑定到变量 *i*

每当需要评估表达式时,Autology 将从当前词法作用域的执行环境中检索 *i* 的当前值,并使用它来评估表达式。

通过绑定 *i* 的新值,我们可以在程序运行时修改 Autology 语言的行为。

你为什么要做这个?

主要是为了好玩和探索一个简洁的想法。

Autology 作为一个语言本身并不是特别有用,它非常慢且资源密集。

宏是 Lisp 语言修改其语法或行为的常用工具,但这些通常仅在编译时可用。Autology 允许在运行时动态重写语言。

即使是其他非 Lisp 语言也能够定义某种形式的领域特定语言(Domain Specific Language),以允许程序员更清楚地表达问题,但是这些通常在范围上非常有限制。Autology 允许完全临时的重写语言语法,以及定义新功能或删除现有功能。

你可以用它做什么?

首先,您可能想向该语言添加函数。Autology 默认情况下没有它们,但是我们可以将 *i* 符号重新绑定到表示新解释器函数的数据结构,该函数确实具有函数。

(bind (;; 抓取 `:atl/eval-list` 部分的副本
    ;; 负责评估列表的解释器。
    original (get-marker *i* :atl/eval-list)
    ;; 为列表表达式开头时使用的 case test+body 定义
    ;; 我们的函数特殊形式,在这种情况下是 `λ`。
    λ-form (qu (λ (let [[_λ params body] e]
            (fn [& values]
             (autology.core/evaluate
             body
             (reduce (fn [acc-env [s v]]
                  (assoc acc-env s v))
                 env
                 (zipmap params values)))))))
    ;; 重新绑定 `*i*` 以成为一个新的解释器,其中
    ;; `:atl/eval-list` 部分替换为包含
    ;; 我们的 lambda 处理特殊形式。
    *i* (replace-marker *i* :atl/eval-list
              (list :atl/eval-list
                 (concat (butlast original)
                     λ-form
                     (list (last original)))))
    ;; 我们现在可以立即定义函数,因为
    ;; 解释器已经更新为评估
    ;; 像这样的剩余绑定。
    double (λ (n)
         (+ n n)))
   ;; 最后,我们可以调用我们的新函数!
   (double (double (double (double (double 1.3125))))))

在那之后,几乎任何你想要的!

运行测试

clojure -X:test

关于

一个关于 Lisp 元编程的热点

资源

Readme 活动

Stars

8 stars

Watchers

1 watching

Forks

0 forks 报告仓库

Releases

没有发布版本

Packages 0

没有发布包

语言