Racket指南

Racket指南

Matthew Flatt,
Robert Bruce Findler,
and PLT

本指南适用于新接触Racket的程序员或部分了解Racket的程序员。本指南假定你是有编程经验的。如果你是新学习编程,可以考虑阅读《如何设计程序》(How to Design Programs)。如果你想要一个对Racket特别快速的介绍,就从《快速:Racket的图片编程介绍》(Quick: An Introduction to Racket with Pictures)开始。

第2章提供了一个对Racket的简要介绍。从第3章开始,本指南深入细节——覆盖了大部分的Racket工具箱,但把更清晰的细节内容留给《Racket参考》(The Racket Reference)及其它参考手册介绍。

本手册源程序可查阅GitHub.

    1 欢迎来到Racket!

      1.1 用Racket进行交互

      1.2 定义和交互

      1.3 创建可执行程序

      1.4 给有LISP/Scheme经验的读者的一个说明

    2 Racket概要

      2.1 简单的值

      2.2 简单的定义和表达式

        2.2.1 定义

        2.2.2 缩进代码的提示

        2.2.3 标识

        2.2.4 函数调用(过程应用程序)

        2.2.5 带if、and、or和cond的条件句

        2.2.6 函数重复调用

        2.2.7 匿名函数与lambda

        2.2.8 用define、let和let*实现局部绑定

      2.3 列表、迭代和递归

        2.3.1 预定义列表循环

        2.3.2 从头开始列表迭代

        2.3.3 尾递归

        2.3.4 递归和迭代

      2.4 pair、list和Racket的语法

        2.4.1 用quote引用pair和symbol

        2.4.2 使用'缩写quote

        2.4.3 列表和Racket语法

    3 内置的数据类型

      3.1 布尔值(Boolean)

      3.2 数值(Number)

      3.3 字符(Character)

      3.4 字符串(Unicode)

      3.5 字节(Byte)和字节字符串(Byte String)

      3.6 符号(Symbol)

      3.7 关键字(Keyword)

      3.8 点对(Pair)和列表(List)

      3.9 向量(Vector)

      3.10 散列表(Hash Table)

      3.11 盒子

      3.12 无效值(Void)和未定义值(Undefined)

    4 表达式和定义

      4.1 标记法

      4.2 标识和绑定

      4.3 函数调用(过程程序)

        4.3.1 求值顺序和实参数量

        4.3.2 关键字参数

        4.3.3 apply函数

      4.4 lambda函数(过程)

        4.4.1 申明一个剩余(rest)参数

        4.4.2 声明可选(optional)参数

        4.4.3 声明关键字(keyword)参数

        4.4.4 实参数量感知函数:case-lambda

      4.5 定义:define

        4.5.1 函数简写

        4.5.2 柯里函数简写

        4.5.3 多值和define-values

        4.5.4 内部定义

      4.6 局部绑定

        4.6.1 并行绑定:let

        4.6.2 顺序绑定:let*

        4.6.3 递归绑定:letrec

        4.6.4 命名let

        4.6.5 多值绑定:let-values,let*-values,letrec-values

      4.7 条件

        4.7.1 简单分支:if

        4.7.2 组合测试:and和or

        4.7.3 编链测试:cond

      4.8 定序

        4.8.1 前效应:begin

        4.8.2 后效应:begin0

        4.8.3 if效应:when和unless

      4.9 赋值:set!

        4.9.1 使用赋值的指导原则

        4.9.2 多值赋值:set!-values

      4.10 引用:quote和'

      4.11 准引用:quasiquote和‘

      4.12 简单分派:case

      4.13 动态绑定:parameterize

    5 程序员定义的数据类型

      5.1 简单的结构类型:struct

      5.2 复制和更新

      5.3 结构子类型

      5.4 不透明结构类型与透明结构类型对比

      5.5 结构的比较

      5.6 结构类型的生成性

      5.7 预制结构类型

      5.8 更多的结构类型选项

    6 模块

      6.1 模块基础

        6.1.1 组织模块

        6.1.2 库集合

        6.1.3 包和集合

        6.1.4 添加集合

      6.2 模块语法

        6.2.1 module表

        6.2.2 #lang简写

        6.2.3 子模块

        6.2.4 main和test子模块

      6.3 模块路径

      6.4 输入:require

      6.5 输出:provide

      6.6 赋值和重定义

    7 合约

      7.1 合约和边界

        7.1.1 合约的违反

        7.1.2 合约与模块的测试

        7.1.3 嵌套合约边界测试

      7.2 函数的简单合约

        7.2.1 ->类型

        7.2.2 使用define/contract和 ->

        7.2.3 any和any/c

        7.2.4 运转你自己的合约

        7.2.5 高阶函数的合约

        7.2.6 带”???“的合约信息

        7.2.7 解析一个合约错误信息

      7.3 一般功能合约

        7.3.1 可选参数

        7.3.2 剩余参数

        7.3.3 关键字参数

        7.3.4 可选关键字参数

        7.3.5 case-lambda的合约

        7.3.6 参数和结果依赖

        7.3.7 检查状态变化

        7.3.8 多个结果值

        7.3.9 固定但静态未知数量

      7.4 合约:一个完整的例子

      7.5 结构上的合约

        7.5.1 确保一个特定值

        7.5.2 确保所有值

        7.5.3 检查数据结构的特性

      7.6 用#:exists和#:∃抽象合约

      7.7 附加实例

        7.7.1 一个客户管理器组建

        7.7.2 一个参数化(简单)栈

        7.7.3 一个字典

        7.7.4 一个队列

      7.8 建立新合约

        7.8.1 合约结构属性

        7.8.2 使所有警告和报警一致

      7.9 问题

        7.9.1 合约和eq?

        7.9.2 合约边界和define/contract

        7.9.3 存在的合约和判断

        7.9.4 定义递归合约

        7.9.5 混合set!和contract-out

    8 输入和输出

      8.1 端口的种类

      8.2 默认端口

      8.3 读写Racket数据

      8.4 数据类型和序列化

      8.5 字节、字符和编码

      8.6 I/O模式

    9 正则表达式

      9.1 编写正则表达式模式

      9.2 匹配正则表达式模式

      9.3 基本申明

      9.4 字符和字符类

        9.4.1 常用的字符类

        9.4.2 POSIX字符类

      9.5 量词

      9.6 簇

        9.6.1 反向引用

        9.6.2 非捕捉簇

        9.6.3 回廊

      9.7 替补

      9.8 回溯

      9.9 前寻与后寻

        9.9.1 前寻

        9.9.2 后寻

      9.10 一个扩展示例

    10 异常与控制

      10.1 异常

      10.2 提示和中止

      10.3 延续

    11 迭代和推导

      11.1 序列构造器

      11.2 for和for*

      11.3 for/list和for*/list

      11.4 for/vector and for*/vector

      11.5 for/and和for/or

      11.6 for/first和for/last

      11.7 for/fold和for*/fold

      11.8 多值序列

      11.9 打断迭代

      11.10 迭代性能

    12 模式匹配

    13 类和对象

      13.1 方法

      13.2 初始化参数

      13.3 内部和外部名称

      13.4 接口

      13.5 Final、Augment和Inner

      13.6 控制外部名称的范围

      13.7 混合

        13.7.1 混合和接口

        13.7.2 mixin表

        13.7.3 参数化的混合

      13.8 特征

        13.8.1 特征作为混合集

        13.8.2 特征里的继承与基类

        13.8.3 trait表

      13.9 类合约

        13.9.1 外部类合约

        13.9.2 内部类合约

    14 单元(组件)

      14.1 签名和单元

      14.2 调用单元

      14.3 链接单元

      14.4 一级单元

      14.5 完整的module签名和单元

      14.6 单元合约

        14.6.1 给签名添加合约

        14.6.2 给单元添加合约

      14.7 unit与module的比较

    15 反射和动态求值

      15.1 eval

        15.1.1 本地域

        15.1.2 名称空间

        15.1.3 名称空间和模块

      15.2 操纵名称空间

        15.2.1 创建和安装名称空间

        15.2.2 跨名称空间共享数据和代码

      15.3 脚本求值和使用load

    16 宏

      16.1 基于模式的宏

        16.1.1 define-syntax-rule

        16.1.2 词法范围

        16.1.3 define-syntax和syntax-rules

        16.1.4 序列的匹配

        16.1.5 标识宏

        16.1.6 set!转化器

        16.1.7 宏生成宏

        16.1.8 展开的例子:按引用调用函数

      16.2 通用宏转换器

        16.2.1 语法对象

        16.2.2 宏转化器程序

        16.2.3 混合模式和表达式:syntax-case

        16.2.4 with-syntax和generate-temporaries

        16.2.5 编译和运行时阶段

        16.2.6 一般阶段级别

          16.2.6.1 阶段和绑定

          16.2.6.2 阶段和模块

        16.2.7 语法污染

    17 创造语言

      17.1 模块语言

        17.1.1 隐式表绑定

        17.1.2 使用#lang s-exp

      17.2 读取器扩展

        17.2.1 源位置

        17.2.2 可读表

      17.3 定义新的#lang语言

        17.3.1 指定#lang语言

        17.3.2 使用#lang reader

        17.3.3 使用#lang s-exp syntax/module-reader

        17.3.4 安装语言

        17.3.5 源处理配置

        17.3.6 模块处理配置

    18 并发与同步

      18.1 线程

      18.2 线程邮箱

      18.3 信号

      18.4 通道

      18.5 缓冲异步通道

      18.6 可同步事件和sync

    19 性能

      19.1 DrRacket中的性能

      19.2 字节码和实时(JIT)编译器

      19.3 模块和性能

      19.4 函数调用优化

      19.5 突变和性能

      19.6 letrec性能

      19.7 Fixnum和Flonum优化

      19.8 未检查、不安全的操作

      19.9 外部指针

      19.10 正则表达式性能

      19.11 内存管理

      19.12 可访问性和垃圾回收

      19.13 弱盒及测试

      19.14 减少垃圾回收暂停

    20 并行

      20.1 前程并行

      20.2 现场并行

      20.3 分布式现场

    21 运行和创建可执行文件

      21.1 运行racket和gracket

        21.1.1 交互模式

        21.1.2 模块模式

        21.1.3 加载模式

      21.2 脚本

        21.2.1 Unix脚本

        21.2.2 Windows批处理文件

      21.3 创建独立可执行文件

    22 更多库

      22.1 图形和图形用户界面

      22.2 Web服务器

      22.3 使用外部库

      22.4 更多其它库

    23 Racket和Scheme的方言

      23.1 更多的Racket

      23.2 标准

        23.2.1 R5RS

        23.2.2 R6RS

      23.3 教学

    24 命令行工具和你的编辑器选择

      24.1 命令行工具

        24.1.1 同时编译和配置:raco

        24.1.2 交互式求值

        24.1.3 Shell补全

      24.2 Emacs

        24.2.1 主要模式

        24.2.2 小模式

        24.2.3 Evil模式的专有包

      24.3 Vim

      24.4 Sublime Text

    Bibliography

    Index

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值