Clojure 学习入门(11)- 宏 macro
来源:互联网 发布:天刀女捏脸数据导入 编辑:程序博客网 时间:2024/04/30 07:17
clojure macro宏在运行之前机械展开,定义宏相当于给语言增加新特性,写宏的*原则*:
- 能写成函数就不要用宏(因为写宏没有写函数简单直观,容易写错,需要先在 REPL 中测试一番)
- 只有不得不用时才用宏(性能要求高时比函数调用快,或者需要“代码<->数据”相互转换)
- 精心设计的宏调用比函数调用更 DSL(如实现控制结构、传递 Java方法)
宏与函数
说明:
正确的宏写法,需要添加 list,宏用defmacro定义,不用宏写法的函数用defn定义
调试宏,用macroexpand展开
宏符号
`
原原本本地直译过去,不用`,let语句不被翻译,例如: (let [datastr '{:a 1 :b 2}])
~'
后面的变量被直接翻译过去,例如:(let [~'conn "meta"] (with-mongo ~'conn))
'~
变量名本身而非值,例如:(defn f1 [x] (println '~x ":" ~x)) (let [a 10] (f1 a)) ;; a:10
~@
表示多条语句
示例1:
说明:'~x 显示变量名,即a
~x 解析为变量值,即a的值 10
示例2:
运行结果:in make-connection = meta
in with-mongo = meta
~'conn = meta
~'tbname = :dict
~@body = meta :dict db-test2' tbl-test2'
说明:
make-connection 和 with-mongo 是定义的函数,后面传递的是参数,使用 ~' 修饰直接翻译过去,即字符串传字符串,:dict 键值也传键值
with-dict 传递多个参数给body,其中 dbname tbname 在 with-dict 中被重新赋值,因此打印出的结果也为赋值后的最新结果
0 0
- Clojure 学习入门(11)- 宏 macro
- Clojure 学习入门(11)—— 宏 macro
- Clojure 学习入门(1) - 学习资料
- Clojure 学习入门(2)- eclipse 插件
- Clojure 学习入门(3)- 数字类型
- Clojure 学习入门(4)- 字符串
- Clojure 学习入门(5)- 关键字
- Clojure 学习入门(6)- 函数定义
- Clojure 学习入门(7)- 连接mysql
- Clojure 学习入门(8)- 连接mongodb
- Clojure 学习入门(9)- 连接redis
- Clojure 学习入门(10)- httpkit
- Clojure 学习入门(12)- map/pmap
- Clojure 学习入门(13)- binding
- Clojure 学习入门(14)- 循环控制
- Clojure 学习入门(15)- 条件判断
- Clojure 学习入门(16)- 正则表达式
- Clojure 学习入门(17)- 异常处理
- oracle表分区详解
- Android中直播视频技术探究之---基础知识大纲介绍
- SSH框架包的问题
- 使用Java创建RESTful Web Service
- sqoop exort data from DB2 or Oracle to Hadoop
- Clojure 学习入门(11)- 宏 macro
- 文章标题
- Codeforces Round #358 (Div. 2) E. Alyona and Triangles (找面积最大三角形)
- 404.leetcode Sum of Left Leaves(easy)[二叉树 递归]
- 用树莓派学编程系列3——环境温湿度测量2
- 希尔排序算法
- java常用函数
- 使用jQuery更新和交互
- Android学习计划