Common Lisp中的读取宏 ' #' `( , ,@) #( ) #na( ) #<OBJECT> :Keyword
当你把 xx 当做符号使用时 'xx , 这个符号是没有任何函数/变量语义的, 仅仅是一个 符号而已(就像一个string一样)
但你可以对这个string有其他的用法,比如使用它所binding的同名函数、使用它所binding的同名动态变量
(要知道,“代码” 不过是 一串String, 这就是 Macro所做的事)
你把Symbol当成一种可绑定函数、变量的东西就可以了!
可以看到, 上图的 defun inc 和 defmacro inc 的内部实现时一模一样的。 它们其实都是接收 symbols作为参数, 然后基于这些symbols 构建 list-of-symbols (Cons/ Tree) , 而构建的目标是可以eval的 Symbols-tree!即如同正常代码一样的一串符号。
另外,它们的调用方式是不同的: 对于defun inc, 调用时要以 symbol的形式: (inc 'x) ====> '(setq x (1+ x)) ,此时得到的是一个列表, 必须显式写 eval 将其转为 代码,随后才可对之求值。
对于defmacro inc, 调用时直接 (inc x) ----宏展开----> (setq x (1+ x)) , 此时相当于这里写的是这行代码,可以直接对其 C-M-x 求值。
The Common Lisp Cookbook - Macros and Backquote
http://cl-cookbook.sourceforge.net/macros.html
说白了:Macro的作用是 根据提供的几个 symbol去构建完整的 symbols-Tree, 在这过程中对一些 符号可以进行 求值—— 即使用它的实际语义来计算一下。。
Common Lisp中的读取宏 ' #' `( , ,@) #( ) #na( ) #<OBJECT> :Keyword的更多相关文章
- ANSI Common Lisp Practice - My Answers - Chatper - 3
Ok, Go ahead. 1 (a) (b) (c) (d) 2 注:union 在 Common Lisp 中的作用就是求两个集合的并集.但是这有一个前提,即给的两个列表已经满足集合的属性了.具体 ...
- common lisp和scheme的区别
1. 在Common Lisp 眼中,一个符号的symbol-value 和symbol-function 是不一样的,而Scheme对两者不作区分.在Scheme 里面,变量只有唯一对应的值,它可以 ...
- 一道Common Lisp 宏的练习题
这是<ANSI Common Lisp>第10章“宏”的习题第6题: 定义一个宏,接受一变量列表以及一个代码主体,并确保变量在代码主体被求值后恢复 (revert)到原本的数值
- 搭建fedora开发环境 common lisp, c++, go
第三方软件库: http://download1.rpmfusion.org/free/fedora/releases/25/Everything/x86_64/os/repoview/index.h ...
- Common Lisp编译程序的小技巧
这几天开始玩Common Lisp,遇上了一个有意思的问题,CL一般是解释运行,也有实现可以编译生成字节码(fas文件).我正在用的两种CL实现是SBCL和CLISP,前者是我从<实用Commo ...
- VC中常用的宏
我们在VS环境中开发的时候,会遇到很多宏定义,这些宏可以应用到代码中,或用于编译.工程选项等设置,总之是我们开发中必不可少的工具,有必要做一个总结.有些宏是C/C++定义的,有些宏是VC环境预 ...
- Common Lisp 编译器IDE环境搭建
搭建Common Lisp编程环境的方法有很多种,这里我使用的是最常见的一种:SBCL + Emacs + SLIME. SBCL是Steel Bank Common Lisp的简称,它是Common ...
- Common Lisp第三方库介绍 | (R "think-of-lisper" 'Albertlee)
Common Lisp第三方库介绍 | (R "think-of-lisper" 'Albertlee) Common Lisp第三方库介绍 一个丰富且高质量的开发库集合,对于实际 ...
- 小议common lisp程序开发流程 - Ever 17 - 博客频道 - CSDN.NET
小议common lisp程序开发流程 - Ever 17 - 博客频道 - CSDN.NET 小议common lisp程序开发流程 分类: lisp 2011-04-17 20:59 1316人阅 ...
随机推荐
- Python从零开始——字符串String
一:Python字符串有哪些内容 二:Python字符串操作符 三:Python字符串格式化——占位符格式化 四:Python字符串格式化——format()函数 五:Python字符串常用操作函数
- 3-14 Pandas绘图
1.魔法指令:%matplotlib inline :数据画图 In [1]: %matplotlib inline import pandas as pd In [2]: import nump ...
- FusionSphere产品功能
华为Fusion产品 FusionSphere解决方案的三种场景 服务器虚拟化 NFVI:运营商基于openstack kvm协议的解决方案 云数据中心 FusionSphere服务器虚拟化解决方案 ...
- Windows | Ubuntu 18.04安装Visual Studio Code
Visual Studio Code是一款很好的开源跨平台代码编辑器,这里使用 tarball 格式文件来安装(免安装), 首先下载 .tar.gz 文件包,点击下载, 可自行在官网下载 将文件包解 ...
- js处理日历
我们在做自动化的时候可能会遇到选择日期这种情况 这个时候我们可能就会想到直接定位不就可以了,为啥还要使用js这种东西呢? 首先,我们想一下定位:定位不仅麻烦而且还不稳定,所以这种方式我是直接就弃用了 ...
- nginx 服务端口权限13的问题
参考此文:https://blog.csdn.net/RunSnail2018/article/details/81185138
- ASP.NET CoreMVC 中的控制器
Controller in ASP.NET Core MVC 在本节中,我们将讨论 Controller 是什么以及它在 ASP.NET Core MVC 中的作用. Fiddler 需要大家提前装一 ...
- 关于RAMOS所用的操作系统
关于RAMOS所用的操作系统 RAMOS所用的操作系统,XP就不用说了,精简版最小的600MB到1.5GB的都有.现代意义上的WIN7/8/10 RAMOS一般选用精简版操作系统,节约内存的同时,还能 ...
- 禁用Chrome的“请停用以开发者模式运行的扩展程序”提示
1.前言 每次启动都会有一个烦人的“请停用以开发者模式运行的扩展程序”提示,这个提示有多烦人,接触过的人都知道,启动的时候它不立即提示,等过了几秒钟等你打开某个网页开始执行某些操作时它突然弹出来干扰你 ...
- Spring Boot下Bean定义方式及调用方式
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...