Lisp(指现在的各种 Lisp 方言,而非原生 Lisp)的编译过程与 C 类似,也是先进行一次宏展开,但它不...
Lisp 中最古老的读取宏之一是',即quote。我们可以定义成: (set-macro-character#\'#'(lambda(streamchar)(list(quotequote)(readstreamtnilt))) 当read在一个普通的语境下遇到'时,它会返回在当前流和字符上调用这个函数的结果。(这个函数忽略了第二个参数,第二个参数永远是引用字符。)所以当read看到'a时,会...
Lisp(指现在的各种 Lisp 方言,而非原生 Lisp)的编译过程与 C 类似,也是先进行一次宏展开,但它不...
你的Common Lisp 实现是一个学习更多有关宏的好地方。借由调用展开至内置宏,你可以理解它们是怎么写的。下面是大多数实现对于一个 cond 表达式会产生的展开式: > (pprint (macroexpand-1 '(cond (a b) (c d e) (t f))) (IF A B (IF C (PROGN D E) F)) 函数pprint 印出像代码一样缩排的表...
(macro)机制允许用户定义任意函数来将特定 Lisp语句在求值或编译之前转化成不同的形式。 其过程是在表达式层面完成的,而不是像绝大多 数其他语言里那样在字符串层面完成。宏对于编 写高品质的代码十分重要,它使得代码在用户层 面更加简洁优雅,同时在执行时又可以被转化成 ...
局部定义函数(flet,labels)和宏(macrolet)是相当令人满意的。新的符号宏工具允许更多的语法存在性。 虽然Lisp语言在风格上比面向语句更具应用性,但是它提供了许多产生副作用的操作,因此需要构造来控制副作用的顺序。构造{progn},大致相当于一个带有所有分号的Algol begin-end块,它按顺序执行许多表单,丢弃除最后一个...
写出能写程序的程序的最普遍方法是通过定义宏。宏是通过转换 (transformation)而实现的操作符。你通过说明你一个调用应该要翻译成什么,来定义一个宏。这个翻译称为宏展开(macro-expansion),宏展开由编译器自动完成。所以宏所产生的代码,会变成程序的一个部分,就像你自己输入的程序一样。
Macro Common Lisp的强大的Macro会让你轻松的扩展CL本身来迎合自己的需求,最终形成一个用来解决你的特定问题的DSL。Lisp语言的Macro提供了语法层次上的抽象,让你可以将反复在程式上出现的模式抽象出来,这也是Lisp强大以及和其它语言区分开来的一个原因。 多范式 Common Lisp的多范式编程可以让你自由地表达自己思想,指令...
11.7 DO macro 11.8 隐式赋值的好处 11.9 do* 11.11 implicit blocks lisp toolkit: time 11.13 optional args 11.14 rest args 11.15 keyword args 11.16 &aux vars 11 Iteration and Block Structure 11.2 dotimes and dolist dotimes和dolist都是macro func ...
后,第2章开始用21页的容量介绍了着手编写Lisp程序时可能用到所有知识。3-9章讲 解了Lisp里面一些重要的知识点。这些章节特别强调了一些重要的概念比如Lisp里面指 针的角色,如何使用递归来解决问题,以及第一级函数(first-classfunction)的重要性。 针对那些想要更深层地了解Lisp的读者:10-14章包含了宏(macro),CLOS...