Clojure 学习入门(11)- 宏 macro
2023-09-14 09:16:11 时间
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 中被重新赋值,因此打印出的结果也为赋值后的最新结果
相关文章
- HTML入门学习笔记(二)
- 设计模式(四)学习----动态代理
- Bootstrap3.0入门学习系列规划[持续更新]
- 【LabVIEW】小白入门学习笔记-汇总
- 【学习总结】jmeter入门概述
- 机器学习入门11 - 逻辑回归 (Logistic Regression)
- RestfulApi 学习笔记——.net core入门操作(二)
- python中学习K-Means和图片压缩
- 深度学习基础(基础知识0)
- kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置
- Leetcode学习计划之动态规划入门day9(139,42)
- Leetcode学习计划之动态规划入门day8(309,714)
- 机器学习笔记 - 探索性数据分析(EDA) 入门案例四
- GeoMesa-空间数据存储引擎入门学习手册
- 程序老鸟C#学习:3天学会全部基础--第二天
- 机器学习入门:多变量线性回归
- 【带着canvas去流浪(11)】Three.js入门学习笔记
- 受限波尔茨曼机RBM_DBN深度学习网络训练和测试matlab仿真,数据库为随机数矩阵
- Python学习03:安装Python
- SDL 简单入门学习
- 2023年网络安全自学入门:(超详细)从入门到精通学习路线&规划,学完即可就业
- 性能测试入门学习 ----- loadrunner常用函数大全及设置项
- 【深度学习入门案例】动物种类识别
- 一种实用的降学习率公式
- 机器学习入门(六)神经网络初识
- GreenPlum的学习心得和知识总结(一)|GreenPlum数据库源码编译安装及学习资料汇总