Clojure编程
2020-04-07 14:06:50 0 举报
AI智能生成
Clojure编程
作者其他创作
大纲/内容
第3部分 工具、平台以及项目
8 Clojure项目的组织与构建
项目布局
定义与使用命名空间
位置、位置、位置
Clojure代码库的功能组织
构建
提前编译
依赖管理
Maven的依赖管理模型
构建工具与配置模式
最后的思考
9 Java及JVM互操作
JVM是Clojure的基础
Java类、方法和字段的使用
便利的互操作工具
异常与错误处理
摆脱检查型异常
with-open:finally的挽歌
为了效率进行类型提示
数组
定义类、实现接口
匿名类的实例:proxy
定义具名的类
注解
在Java里使用Clojure
使用deftype和defrecord类
实现协议接口
乐于合作的伙伴
10 面向REPL的编程
交互式开发
持续、演化的环境
工具集
最简的REPL
Eclipse
Emacs
在REPL里调试、监测和打补丁
“已部署”REPL的特别考虑
重定义结构的限制
小结
第4部分 实战
11 数字与数学
Clojure中的数字
Clojure首选64比特(或更大)的表示
Clojure的混合数字模型
有理数
数字传播规则
Clojure中的数学
有限与任意精度
无检查的操作
任意精度的小数操作的刻度和取整模式
相等与等值
对象相同(identical? )
引用相等(=)
数字等值(==)
优化数字效率
声明函数接受和返回原始类型
合理使用原始类型的数组
用Clojure可视化芒德布罗集
12 设计模式
依赖注入
策略模式
责任链
面向方面的编程
最后的思考
13 测试
不可变值与纯函数
模拟
clojure.test
定义测试
测试“套件”
Fixtures
HTML DSL的成长
依赖断言
前条件和后条件
14 使用关系数据库
clojure.java.jdbc
with-query-results解析
事务
连接池
Korma
前奏
查询
为什么不嫌麻烦地用DSL?
Hibernate
设置
持续数据
运行查询
去掉样板
最后的思考
15 使用非关系型数据库
安装Couch DB和Clutch
基本的CRUD操作
视图
一个简单的(Java Script)视图
用Clojure写的视图
_changes:把Couch DB滥用做消息队列
可随意点选的消息队列
最后的思考
16 Clojure与Web
Clojure栈
基石:Ring
请求与应答
适配函数
处理函数
中间件
用Compojure路由请求
使用模板
Enlive:基于选择器的HTML转换
最后的思考
17 部署Clojure Web应用程序
Java与Clojure Web架构
Web应用程序打包
在本地运行Web应用
Web应用程序部署
在Amazon的Elastic Beanstalk上部署Clojure应用
超越简单Web应用程序部署
第5部分 杂项
18 明智地选择Clojure类型定义形式
19 在工作场所引进Clojure
事实是……
强调生产效率
强调社区
审慎
20 下一步?
(dissoc Clojure 'JVM)
Clojure CLR
Clojure Script
4Clojure
Overtone
core.logic
Pallet
Avout
Heroku上的Clojure
封面介绍
O'Reilly Media, Inc.介绍
1 进入Clojure仙境
为什么要选择Clojure?
获取Clojure
Clojure REPL
不!括号真的不会让你瞎了眼
表达式、操作符、语法以及优先级
同像性
Clojure Reader
标量字面量
注释
空格和逗号
集合字面量
reader的一些其他语法糖
命名空间
符号求值
特殊形式
阻止求值:quote
代码块:do
定义Var:def
本地绑定:let
解构(let,第2部分)
定义函数:fn
条件判断:if
循环:loop和recur
引用var:var
和Java的互操作:.和new
异常处理:try和throw
状态修改:set!
锁的原语:monitor-enter和monitor-exit
小结
eval
这只是开始
第1部分 函数式编程以及并发
2 函数式编程
所谓函数式编程,到底意味着什么?
谈谈值的重要性
关于值
值与可变对象的比较
一个关键性的选择
作为头等公民的函数以及高阶函数
Apply, Partial
函数(功能)的组合
编写高阶函数
利用可组合的高阶函数构建一个日志系统
纯函数
为什么纯函数很有意思?
现实生活中的函数式编程
3 集合类与数据结构
抽象优于实现
集合:collection
序列:Sequence
Associative
索引集合:Indexed
栈:stack
set
有序集合:sorted
访问集合元素的简洁方式
习惯用法
集合、key以及高阶函数
数据结构的类型
列表:List
vector
set
map
不可变性和持久性
持久性与结构共享
易变集合
元数据
用Clojure的集合来小试牛刀
标识符和循环引用
思维方式的改变:从命令式到函数式
遍历、更新以及Zipper
总结
4 多线程和并发
计算在时间和空间内的转换
delay
future
promise
简单的并行化
状态和标识
Clojure的引用类型
并发操作的分类
原子类型(Atom)
通知和约束
观察器
校验器
ref
软件事务内存
对ref进行修改的机制
STM的一些缺点
var
定义var
动态作用域
var不是变量
前置声明
agent
处理agent action中的错误
I/O、事务以及嵌套的Send
使用Java的并发原语
Locking
总结
第2部分 构建抽象
5 宏
宏到底是什么?
宏不是什么
有什么是宏能做而函数不能做的
宏vs.Ruby的eval
编写你的第一个宏
调试宏
宏扩展
语法
引述和语法引述
反引述与编接反引述
什么时候使用宏
宏卫生
Gensym来拯救
让宏的用户来选择名字
重复求值
宏的常见用法和模式
隐藏参数:&env 和 &form
&env
&form
测试上下文相关的宏
深入->和->>
总结
6 数据类型和协议
协议
扩展已有的类型
定义你自己的类型
记录
类型
实现协议
内联实现
重用实现
协议自省
协议函数分派的边界场景
自己实现一个set
总结
7 多重方法
多重方法基础
通往层级之路
层级
独立层级
真正实现多重!
还有几件事
多重继承
内省多重方法
type或class;或者说,映射的报复
转发函数的范围是无限的
最后的思考
0 条评论
下一页