乐趣区

关于java:用java写lisp-解释器-8-defun-用宏实现-附源码

日常咱们写 lisp 程序的时候一些过程能够通过复合表达式定义,通常状况下能够用 lambda,lambda 表达式格局如下:

(lambda (args) exp)

而后如何让这个过程复用呢,这个时候咱们起个名字援用它,个别能够用 define 表达式,格局如下:

(define symbol exp)

而后咱们以写 println 这个过程(函数为例),咱们能够将 display、newline 过程组合成一个新的过程(函数),能够这样写:

(define println (lambda (x) ((display x)
    (newline))))

而后输出

(println 'hello-world')
=> 'hello-world'

咱们能不能简化带有名称的函数编写呢?,当然是能够的,这里咱们通过定义一个宏函数,它长这样

(define-macro defun (lambda (name args . body) (
    `(define ,name (lambda ,args ,@body)
    )
)))

还是以 println 函数为例,那么怎么定义呢?能够这样:

(defun println (x) ((display x)
    (newline)
))

而后输出

(println 'hello-world')
=> 'hello-world'

总结

通过宏咱们能够裁减咱们应用语言的语法结构,使一些语法变得更简略,但它无疑也是一把双刃剑,它会让咱们应用的语言成为另一种语言,对定义者兴许是敌对的,但对使用者无疑减少了许多心智累赘,如何权衡利弊的去应用宏不是一个欲速不达的过程。

退出移动版