Skip to content

Commit

Permalink
housekeeping
Browse files Browse the repository at this point in the history
  • Loading branch information
faiz-lisp committed Jan 15, 2020
1 parent 63162e8 commit b6184a3
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions 16.CompatibilityFeatures.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# 第16章 兼容功能 (Compatibility Features)
本章介绍了当前版本的 Chez Scheme中包含的几个项目,主要是为了与系统的较早版本兼容。

[16.1节](#16.1) 描述了一个哈希表接口,此接口自此已被R6RS哈希表接口取代[16.2节](#16.2) 描述了扩展语法宏。当前版本的 Chez Scheme直接支持这些功能,但在将来的版本中可能会不再支持。新程序应改用 The Scheme Programming Language,第4版 [11]中描述的标准机制。
[16.1节](#16.1) 描述了一个哈希表接口,此接口自此已被 R6RS哈希表接口取代[16.2节](#16.2) 描述了扩展语法宏。当前版本的 Chez Scheme直接支持这些功能,但在将来的版本中可能会不再支持。新程序应改用 The Scheme Programming Language,第4版 [11]中描述的标准机制。

[16.3节](#16.3) 描述了一种将类似记录的结构定义为向量而不是新的唯一类型的机制。新程序应改用 define-record(在7.15节中介绍)。

Expand Down Expand Up @@ -95,15 +95,15 @@ hash-table-map将 p应用于每个键,以 ht的值关联(不按特定顺序)
[(let ([x e] ...) b1 b2 ...)
((lambda (x ...) b1 b2 ...) e ...)])
```
下一个示例显示 let*其语法为同一 设,但其被递归地定义在以下方面 let具有两个子句(一项所述的基材的情况下,一个用于递归步骤),因为它必须产生一个嵌套结构
下一个示例显示 let*其语法与 let相同,但它是用两个子句(一个用于基本情况,一个用于递归步骤)递归定义的,因为它必须生成嵌套结构
```
(extend-syntax (let*)
[(let* () b1 b2 ...)
(let () b1 b2 ...)]
[(let* ([x e] more ...) b1 b2 ...)
(let ([x e]) (let* (more ...) b1 b2 ...))])
```
第一个模式/模板序对匹配没有标识符/值序对的任何 let*表达式,并将其映射到等效的 begin表达式中。这是基本情况。第二个模式/模板序对将任何 let*表达式与一个或多个标识符/值序对匹配,并将其转换为绑定第一个序对的 let表达式,主体的主体是 let*表达式,其绑定其余序对。这是递归步骤,最终将我们引向基本情况,因为我们在每一步都删除了一个标识符/值序对。请注意,第二个模式更多地使用了模式变量用于第二和以后的标识符/值序对;这样可以减少模式和模板的混乱程度,并且可以清楚地看到只有第一个标识符/值序对被明确处理。
第一个模式/模板序对会匹配没有标识符/值序对的任何 let*表达式,并将其映射到等效的 begin表达式中。这是基本情况。第二个模式/模板序对将任何 let*表达式与一个或多个标识符/值序对匹配,并将其转换为绑定第一个序对的 let表达式,主体的主体是 let*表达式,其绑定其余序对。这是递归步骤,最终将我们引向基本情况,因为我们在每一步都删除了一个标识符/值序对。请注意,第二个模式更多地使用了模式变量用于第二和以后的标识符/值序对;这样可以减少模式和模板的混乱程度,并且可以清楚地看到只有第一个标识符/值序对被明确处理。

and的定义需要三个子句。第一个子句是识别(and)所必需的,后两个子句递归地定义其他 and的形式。
```
Expand Down Expand Up @@ -156,7 +156,7 @@ with的一个常见用法是在模板中引入临时标识符或临时标识符
(let ([temp x])
(if temp temp (or y ...)))])
```
直到我们将或表达式放置在temp发生的范围内之前,这种方法才起作用,在这种情况下,可能会发生奇怪的事情,因为 extend-syntax不尊重词汇范围。(这是 define-syntax优于 extend-syntax的原因之一。)
这种方法工作正常,直到我们将或表达式放置在 temp发生的范围之前,在这种情况下,可能会发生奇怪的事情,因为 extend-syntax不遵循词法检查。(这是 define-syntax优于 extend-syntax的原因之一。)
```
(let ([temp #t])
(or #f temp)) => #f
Expand Down Expand Up @@ -198,7 +198,7 @@ with的一个常见用法是在模板中引入临时标识符或临时标识符

define-structure 的定义使用了两个 pattern / template子句。需要两个子句来处理第二个子表达式的可选性。第一个子句与没有第二个子表达式的形式匹配,仅将其转换为存在第二个子表达式的等效形式,但为空。

该定义还大量使用 with在展开时计算方案表达式。前四个 with子句用于生成标识符,这些标识符命名自动定义的过程。(过程格式在这里特别有用,但是可以用string-append!替换,根据需要使用symbol->string。)前两个子句生成单个标识符(用于构造函数和谓词),而后两个子句生成标识符列表(用于字段访问和赋值过程)。第五个 with子句(外部 with中的最后一个子句)用于计算结构的每个实例所需的总长度向量,其中必须包括名称和所有字段的空间。最后的 with子句(内部 with中的唯一子句)用于创建向量索引列表,每个字段一个索引(从1开始,因为结构名称占据位置0)。
该定义还大量使用 with在展开时计算方案表达式。前四个 with子句用于生成标识符,这些标识符命名自动定义的过程。(过程格式在这里特别有用,但是可以用 string-append!替换,根据需要使用 symbol->string。)前两个子句生成单个标识符(用于构造函数和谓词),而后两个子句生成标识符列表(用于字段访问和赋值过程)。第五个 with子句(外部 with中的最后一个子句)用于计算结构的每个实例所需的总长度向量,其中必须包括名称和所有字段的空间。最后的 with子句(内部 with中的唯一子句)用于创建向量索引列表,每个字段一个索引(从1开始,因为结构名称占据位置0)。
```
(extend-syntax (define-structure)
[(define-structure (name id1 ...))
Expand Down Expand Up @@ -345,9 +345,9 @@ define-structure定义一个新的数据结构 name,并创建一组用于创
(stretch-string-length ss) => 8
(stretch-string-string ss) => "@@@@@@@="
```
Scheme编程语言第4版第8.4节定义了 define structure的简化变体,作为使用语法 case的示例。下面给出的定义实现了完整的版本。
Scheme编程语言第4版第8.4节定义了 define-structure的简化变体,作为使用语法 case的示例。下面给出的定义实现了完整的版本。

define-structure扩展为一系列由结构名称和字段名称生成的名称的定义。生成的标识符使用 datum->syntax使标识符在定义结构 形式出现的地方可见。由于 define结构表单扩展为包含定义的 begin,因此它本身就是一个定义,可以在定义有效的地方使用。
define-structure扩展为一系列由结构名称和字段名称生成的名称的定义。生成的标识符使用 datum->syntax使标识符在define-structure形式出现的地方可见。由于 define-structure表单扩展为包含定义的 begin,因此它本身就是一个定义,可以在定义有效的地方使用。
```
(define-syntax define-structure
(lambda (x)
Expand Down

0 comments on commit b6184a3

Please sign in to comment.