The Scheme Programming Language 读书笔记,chapter 10.
Chapter 10. Libraries and Top-Level Programs
R6RS定义了程序库以及顶级程序。库采用的命名方式有点特别,形如:(a), (a b), (a b ()), (a b (1 2 3))
。
An implementation of the standard library mechanism is available with the portable implementation of syntax-case at http://www.cs.indiana.edu/syntax-case/.
Section 10.1. Standard Libraries
基础库(rnrs base (6))
。
下面是单独列出的库:
(rnrs arithmetic bitwise (6))
(rnrs arithmetic fixnums (6))
(rnrs arithmetic flonums (6))
(rnrs bytevectors (6))
(rnrs conditions (6))
(rnrs control (6))
(rnrs enums (6))
(rnrs eval (6))
(rnrs exceptions (6))
(rnrs files (6))
(rnrs hashtables (6))
(rnrs io ports (6))
(rnrs io simple (6))
(rnrs lists (6))
(rnrs mutable-pairs (6))
(rnrs mutable-strings (6))
(rnrs programs (6))
(rnrs r5rs (6))
(rnrs records procedural (6))
(rnrs records syntactic (6))
(rnrs records inspection (6))
(rnrs sorting (6))
(rnrs syntax-case (6))
(rnrs unicode (6))
除了基础库,还有(rnrs (6))
,这包括base,以及上面列举的库,但是不包括(rnrs eval (6))
, (rnrs mutable-pairs (6))
, (rnrs mutable-strings (6))
, 以及(rnrs r5rs (6))
。
Section 10.2. Defining New Libraries
可以用library语法格式来定义新的库:
(library library-name
(export export-spec ...)
(import import-spec ...)
library-body)
…
Section 10.3. Top-Level Programs
顶层程序不是语法形式,而是存在不同文件中的源代码。顶层程序可以看作是没有library形式的library。并且顶层程序中定义和表达式可以互相混合。所以顶层程序实际上是下列import形式:
(import import-spec ...)
definition-or-expression
...
顶层程序的表示式,如果在定义之前出现,可以看成是某种变量对应的定义,只不过这个变量不是真的存在。
执行诀:
(command-line)
(exit)
Section 10.4. Examples
略
Chapter 11. Exceptions and Conditions
异常(Exception)和状况(condition)为系统以及用户提供了发射,检测以及修正错误的能力。
语法形式和执行诀都可能产生异常。异常也可以通过raise
和raise-continuable
来直接产生。
程序执行的任意时间点,都存在单个异常处理器,也就是current exception handler
,用来处理抛出的异常。默认的异常处理器通常打印异常相关的某些信息,比如异常发生的状况;并且在严重的情况下,终止程序的运行。如果是交互的条件下,终止运行意味着重置REPL。
通过guard语法,或者通过with-exception-handler
执行诀来自定义异常处理。自定义的异常处理可以只针对部分状况,并且可以嵌套。
Section 11.1. Raising and Handling Exceptions
执行诀
(raise obj)
(raise-continuable obj)
(error who msg irritant ...)
(assertion-violation who msg irritant ...)
- 语法形式
(assert expression)
(syntax-violation who msg form)
(syntax-violation who msg form subform)
(with-exception-handler procedure thunk)
- 语法形式
(guard (var clause1 clause2 ...) b1 b2 ...)
Section 11.2. Defining Condition Types
可以在raise或者raise-continuable的时候指定condition对象用来描述异常。
状况类型有点类似记录类型,不过更灵活,一个实际状况可以是两个或者多个不相干的状况类型,也就是复合状况,对应的就是简单状况。
- 语法
&condition
(condition? obj)
(condition condition ...)
(simple-conditions condition)
- 语法
(define-condition-type name parent constructor pred field ...)
(condition-predicate rtd)
(condition-accessor rtd procedure)
Section 11.3. Standard Condition Types
- 语法
&serious
(make-serious-condition)
(serious-condition? obj)
(define-condition-type &serious &condition
make-serious-condition serious-condition?)
- 语法
&violation
(make-violation)
(violation? obj)
(define-condition-type &serious &condition
make-serious-condition serious-condition?)
- 语法
&assertion
(make-assertion-violation)
(assertion-violation? obj)
- 语法
&error
(make-error)
(error? obj)
- 语法
&warning
(make-warning)
(warning? obj)
- 语法
&message
(make-message-condition message)
(message-condition? obj)
(condition-message condition)
- 语法
&irritants
(make-irritants-condition irritants)
(irritants-condition? obj)
(condition-irritants condition)
- 语法
&who
(make-who-condition who)
(who-condition? obj)
(condition-who condition)
- 语法
&non-continuable
(make-non-continuable-violation)
(non-continuable-violation? obj)
- 语法
&implementation-restriction
(make-implementation-restriction-violation)
(implementation-restriction-violation? obj)
- 语法
&lexical
(make-lexical-violation)
(lexical-violation? obj)
- 语法
&syntax
(make-syntax-violation form subform)
(syntax-violation? obj)
(syntax-violation-form condition)
(syntax-violation-subform condition)
- 语法
&undefined
(make-undefined-violation)
(undefined-violation? obj)
- 语法
&i/o
(make-i/o-error)
(i/o-error? obj)
- 语法
&i/o-read
(make-i/o-read-error)
(i/o-read-error? obj)
- 语法
&i/o-write
(make-i/o-write-error)
(i/o-write-error? obj)
- 语法
&i/o-invalid-position
(make-i/o-invalid-position-error position)
(i/o-invalid-position-error? obj)
(i/o-error-position condition)
- 语法
&i/o-filename
(make-i/o-filename-error filename)
(i/o-filename-error? obj)
(i/o-error-filename condition)
- 语法
&i/o-file-protection
(make-i/o-file-protection-error filename)
(i/o-file-protection-error? obj)
- 语法
&i/o-file-is-read-only
(make-i/o-file-is-read-only-error filename)
(i/o-file-is-read-only-error? obj)
- 语法
&i/o-file-already-exists
(make-i/o-file-already-exists-error filename)
(i/o-file-already-exists-error? obj)
- 语法
&i/o-file-does-not-exist
(make-i/o-file-does-not-exist-error filename)
(i/o-file-does-not-exist-error? obj)
- 语法
&i/o-port
(make-i/o-port-error pobj)
(i/o-port-error? obj)
(i/o-error-port condition)
- 语法
&i/o-decoding
(make-i/o-decoding-error pobj)
(i/o-decoding-error? obj)
- 语法
&i/o-encoding
(make-i/o-encoding-error pobj cobj)
(i/o-encoding-error? obj)
(i/o-encoding-error-char condition)
- 语法
&no-infinities
(make-no-infinities-violation)
(no-infinities-violation? obj)
- 语法
&no-nans
(make-no-nans-violation)
(no-nans-violation? obj)
Chapter 12. Extended Examples
略
(本篇完)