The Racket Reference阅读笔记。

2 Notation for Documentation

2.1 Notation for Module Documentation

racket按照模块组织代码。文档会在开头标明相应的模块。

(require racket/list)

或者

#lang racket/base

后者表明模块通常是作为语言使用的。

在文档开头或者章节开头的模块定义,在子模块中也可见。

2.2 Notation for Syntactic Form Documentation

句构形式都会配有相应的语法,例如下面是给if的语法:

(if test-expr then-expr else-expr)

每个句形都表示成句构对象。括弧表示句构对象是一个连对。按照约定,有时候会使用方括号而不是括弧。

语法中的斜体标识符用来表示元变量,即为其他语法所生成的对象:

  • id结尾的元变量表示标识符
  • keyword结尾的表示句构对象的关键字
  • expr结尾的表示任意形式的表达式
  • body结尾的表示任意形式的局部定义或者表达式,定义必须出现在表达式之前,body必须以表达式收尾
  • datum结尾可以表示任意形式,但不会被解读
  • number或者boolean结尾的表示句构对象的数字或者布尔值。

如果语法中的元变量自身没有语法定义,则会在语法之后注出,例如:

(lambda formals body ...+)

 
formals	 	=	 	id
 	 	|	 	(id ...)
 	 	|	 	(id ...+ . rest-id)

一些句型构造如果有多种顶层语法,则按以下方式表示:

(init-rest id)
(init-rest)

一些语法也会为某些元变量指定合约,例如:

(parameterize ([parameter-expr value-expr] ...)
  body ...+)
 
  	parameter-expr	 	:	 	parameter?

2.3 Notation for Function Documentation

执行诀和其他值的记述形式基于合约:

(char->integer char) → exact-integer?

  char : char?

合约只是用来表明设计目的,具体的执行诀并不一定真会以合约来检查调用参数。

语法中也会体现可选参数,如下所示:

(read [in]) → any

  in : input-port? = (current-input-port)

当然,语法中也可以体现关键字:

(sort	 	lst	 	 	 	 
 	 	less-than?	 	 	 	 
 	 [	#:key extract-key	 	 	 	 
 	 	#:cache-keys? cache-keys?])	 	→	 	list?
  lst : list?
  less-than? : (any/c any/c . -> . any/c)
  extract-key : (any/c . -> . any/c) = (lambda (x) x)
  cache-keys? : boolean? = #f

2.4 Notation for Structure Type Documentation

结构类型也可以按照合约方式记述:

(struct color (red green blue alpha))

  red : (and/c natural-number/c (<=/c 255))
  green : (and/c natural-number/c (<=/c 255))
  blue : (and/c natural-number/c (<=/c 255))
  alpha : (and/c natural-number/c (<=/c 255))

2.5 Notation for Parameter Documentation

动参也是按照函数的方式记述的:

(current-command-line-arguments) → (vectorof string?)

(current-command-line-arguments argv) → void?
  argv : (vectorof (and/c string? immutable?))

动参既可以被读取,又可以被设置。

2.6 Notation for Other Documentation

有一些库提供到常量值的绑定,比如:

object% : class?

(本篇完)