Lisp 中最古老的读取宏之一是',即quote。我们可以定义成: (set-macro-character#\'#'(lambda(streamchar)(list(quotequote)(readstreamtnilt))) 当read在一个普通的语境下遇到'时,它会返回在当前流和字符上调用这个函数的结果。(这个函数忽略了第二个参数,第二个参数永远是引用字符。)所以当read看到'a时,会...
你的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语句在求值或编译之前转化成不同的形式。 其过程是在表达式层面完成的,而不是像绝大多 数其他语言里那样在字符串层面完成。宏对于编 写高品质的代码十分重要,它使得代码在用户层 面更加简洁优雅,同时在执行时又可以被转化成 ...
那个精确的规则是由macrolet定义的宏展开函数是在全局环境中定义的;通常在词法上明显的词汇范围实体在扩展函数中不可见。 精确的规则是,由macrolet定义的宏扩展函数是在全局环境中定义的;通常在词汇上明显的词汇范围实体在扩展函数中是不可见的。 Lisp中传统的条件结构是cond。然而,if要简单得多,并且可以直接与其他编...
写出能写程序的程序的最普遍方法是通过定义宏。宏是通过转换 (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...
10.7 範例:實用的宏函數 (Example: Macro Utilities) 6.4 節介紹了實用函數 (utility)的概念,一種像是構造 Lisp 的通用運算子。我們可以使用宏來定義不能寫作函數的實用函數。我們已經見過幾個例子: nil! , ntimes 以及while ,全部都需要寫成宏,因爲它們全都需要某種控制參數求值的方法。本節給出更多你可以使用...
一個宏字元 (macro character)是獲得 read 特別待遇的字元。比如小寫的 a ,通常與小寫 b 一樣處理,但一個左括號就不同了: 它告訴 Lisp 開始讀入一個列表。 一個宏字元或宏字元組合也稱作 read-macro (讀取宏) 。許多 Common Lisp 預定義的讀取宏是縮寫。比如說引用 (Quote): 讀入一個像是 'a 的表達...