Lispsyntax.jl:julia的类似于Clojure的Lisp语法

2021-01-20 02:21:30

lisp"(defn fib [a](如果(< a 2)a(+(fib(-a 1))(fib(-a 2))))" @test lisp"(fib 30)" == 832040 @测试fib(30)== 832040

LispSyntax.jl被实现为类似lisp / clojure的语法与朱莉娅的AST之间的表达式转换器。 Julia的编译器,JIT和多调度基础结构用于代码生成和执行。因此,LispSyntax.jl并不是真正意义上的Clojure或Lisp。语义完全基于julia(在许多方面与scheme / lisp非常相似)。最终结果是LispSyntax.jl实际上是julia的另一种类似于S表达式的语法,而不是clojure或lisp的实现。

符号名称不能包含-,*,/ 、? ...-永远使用Julia符号命名,因此,在LispSyntax.jl中维护了Julia语法限制。

在函数作用域中引用全局变量-Julia要求声明在函数范围中引用的全局符号。由于这个功能,需要声明哪些符号是全局的。这是通过特殊形式(全局符号*)完成的。

未实现的绑定形式-Clojure具有非常出色的解构绑定,可用于大多数需要绑定的特殊形式(例如let,fn参数列表等)。目前尚未实现。

缺少循环/重复-目前尚未实现。与Clojure一样,julia当前不支持TCO,因此可能需要类似的东西(但是尾调用重写的宏实现可能更适合julia)。

命名函数为julia方法-为了提高效率,将使用defn定义的函数转换为普通julia函数表达式。这意味着在本地范围内被称为lambda的行为。

方法定义-目前尚未实现。如果实施,它将可能不是Clojure复杂的调度系统的完整实施。

宏差异-LispSyntax.jl中定义的宏看起来像标准Lisp宏,但是由于表达式是特殊对象injulia,因此从宏返回的S表达式需要特殊的翻译步骤才能生成julia表达式树。结果是LispSyntax.jl宏可以直接转换为Julia宏,并且必须通过特殊语法(例如(@macro expr))进行调用。宏卫生遵循朱利叶(Julia)的默认卫生方法,并使用esc进行了显式转义。这与Clojure宏相反,后者使用带有特定命名变量的显式卫生。

尚不支持Julia的字符串宏调度(尚未)-对于@r_str之类的宏,在Julia中可以通过r""进行调用,目前有必要通过标准宏语法来调用它们: 34; string")

LispSyntax.jl提供了一种便利的REPL,从而减轻了人们输入lisp"(...)"的麻烦。对于每个顶级表达式。为了使用REPLmode,只需对其进行初始化:

朱莉娅>使用LispSyntaxjulia> LispSyntax。 init_repl()REPL模式Lisp模式已初始化。按)进入,按Backspace退出。

λ (* 2(减少+(:1 6)))42jλ> (defn fib [a](如果(< a 2)a(+(fib(-a 1))(fib(-a 2)))))fib(一种方法的泛型函数) (fib 10)55

要返回到Julia提示符,只需键入退格键类型或Ctrl-C。到达那里后,您仍然可以访问您定义的功能:

import vs. using vs. include –仅使用当前已实现且令人困惑,它与Clojure的导入形式相匹配。