LISP 8.8 编写宏中宏
来源:互联网 发布:域名便宜 编辑:程序博客网 时间:2024/05/16 10:33
宏的作用是将常见的句法模式抽象掉,而反复出现在宏编写的特定模式同样也可受益于其抽象能力。
最后的几个do-primes函数中,都是以let形式确保子形式仅被求值一次的,引入了一些变量用来保存宏展开过程中用到的生成符号。
这也是一个常见模式,同样的也可以使用一个宏来将它抽象掉。
;;;编写宏中宏(defmacro with-gensyms ((&rest names) &body body) `(let ,(loop for n in names collect `(,n (gensym))) ,@body))(defmacro do-primes-4 ( (var start end) &body body) (with-gensyms (ending-value) `(do ((,var(next-prime ,start) (next-prime(1+ ,var))) (,ending-value ,end)) ((> ,var ,ending-value)) ,@body)))
你可以通过将name替换成一个符号的列表,从而测试LOOP表达式生成的代码:
CL-USER> (loop for n in '(hello world) collect `(,n (gensym)))((HELLO (GENSYM)) (WORLD (GENSYM)))
当编译关于do-primes的defmacro时,with-gensyms形式就被展开并被编译。
这样,do-primes的编译版本就已经跟你手写外层的let时一样。
当编译一个使用了do-primes的函数时,由with-gensyms生成的代码将会运行用来生成do-primes的展开式,
但with-gensyms宏本身在编译一个do-primes形式时并不会被用到,因为在do-primes被编译时,with-gensyms已经被展开。
- LISP 8.8 编写宏中宏
- JavaScript 编写的迷你 Lisp 解释器
- JavaScript 编写的迷你 Lisp 解释器
- Programming in Emacs Lisp笔记 编写函数
- 编写并运行第一个Lisp程序
- Lisp
- Lisp
- lisp
- LISP
- LISP
- lisp
- Programming in Emacs Lisp笔记(三)编写函数
- Common Lisp 语言编写的Tic-Tac-Toe
- 如何使用Python编写一个Lisp解释器
- 56种语言编写一个Lisp解释器
- 求助:使用AUTO LISP语言编写“递归生长算法生成TIN”的程序
- Emacs Lisp编写类似vim中跳转到上一个空行和下一个空行的功能
- 用 sbcl, asdf 和 cl-launch 编写可分发的 lisp 程序
- php install phpunit on ubuntu
- WPF控件(Control类:颜色与字体)
- oracle中函数,游标的使用
- 软件架构设计箴言理解 (转自博客园)
- 关于视频的知识分析
- LISP 8.8 编写宏中宏
- 为什么中国人的考核要以他国母语?
- 按几率抽题算法
- C语言关于图像处理的函数
- Three Standard Streams: stdin, stdout, stderr
- 架构设计--逻辑层 vs 物理层(转自博客园)
- android自定义listview点击时的颜色
- What's new in windows server 2012 networking (Part 1)
- 点点感想