我们在写lisp程序的时候,有些过程可以用复合表达式来定义。通常,可以使用lambda。lambda表达式的格式如下:(lambda(args)exp)然后是如何让这个过程可复用。这时候,我们可以用一个名字来指代它。通常,我们可以使用定义表达式。格式如下:(definesymbolexp)然后我们写println的过程(以函数为例),我们可以把display和newline的过程组合成一个新的过程(函数),可以这样写:(defineprintln(lambda(x)((displayx)(newline))))andenter(println'hello-world')=>'hello-world'我们能简化写有名字的函数吗?,当然有可能。这里我们定义了一个宏函数,看起来像这样(define-macrodefun(lambda(nameargs.body)(`(define,name(lambda,args,@body)))))或者以println函数结尾一个例子,那么如何定义呢?可以这样:(defunprintln(x)((displayx)(newline)))然后输入(println'hello-world')=>'hello-world'总结通过宏,我们可以扩展语法结构我们使用的语言,让一些语法变得更简单,但这无疑是一把双刃剑。它会让我们的语言使用另一种语言。对定义者可能是友好的,但无疑会给使用者增加很多精神负担。如何使用宏的权衡不是一蹴而就的过程。
