The Scheme Programming Language 读书笔记,chapter 5.

Chapter 5. Control Operations

本章涉及控制结构相关的语法形式。

Section 5.1. Procedure Application

形如(expr0 expr1 ...),是最基本的scheme的控制结构。任何以非语法关键字开头的此形式都是执行诀施用。

对于各个expr的调用,只要求逐一执行,对于具体的执行顺序是没有要求的。

另一种执行诀的调用形式是(apply procedure obj ... list),apply除了把obj …作为参数传给procedure,还把list中的每个元素作为额外参数传给procedure。

Section 5.2. Sequencing

形如(begin expr1 expr2 ...),主要用于将多个expr的求值串起来。begin也可以将多个定义串起来,例如:

(let ()
  (begin (define x 3) (define y 4))
  (+ x y))

许多语法形式,诸如lambda, case-lambda, let, let*, letrec以及letrec*,还有一些子句,比如cond, case以及do,它们的躯体有如囊括在begin中一样,是按串起来的。

Section 5.3. Conditionals

有以下形式:

  • (if test consequent alternative)
  • (not obj)
  • (and expr ...)
  • (or expr ...)
  • (cond clause1 clause2 ...)
  • else
  • (when test-expr expr1 expr2 ...)
  • (case expr0 clause1 clause2 ...)

Section 5.4. Recursion and Iteration

形如(let name ((var expr) ...) body1 body2 ...)

这个叫俱名let,例子:

(define divisors
  (lambda (n)
    (let f ([i 2])
      (cond
	[(>= i n) '()]
	[(integer? (/ n i)) (cons i (f (+ i 1)))]
	[else (f (+ i 1))]))))

形如(do ((var init update) ...) (test result ...) expr ...)

例子:

(define fibonacci
  (lambda (n)
    (if (= n 0)
      0
      (do ([i n (- i 1)] [a1 1 (+ a1 a2)] [a2 0 a1])
	((= i 1) a1)))))

Section 5.5. Mapping and Folding

形如(map procedure list1 list2 ...),例子:

(map (lambda (x y) (* x y))
     '(1 2 3 4)
     '(8 7 6 5))

形如(for-each procedure list1 list2 ...),和map的区别是不返回一个连对作为结果,另外procedure的调用顺序是从左到右。

形如(exists procedure list1 list2 ...),用于连对查找。

形如(for-all procedure list1 list2 ...),检查执行诀在所有子元素上是否执行结果都为真。

形如(fold-left procedure obj list1 list2 ...)

形如(fold-right procedure obj list1 list2 ...)

形如(vector-map procedure vector1 vector1 ...)

形如(vector-for-each procedure vector1 vector2 ...)

形如(string-for-each procedure string1 string2 ...)

Section 5.6. Continuations

continuation可以用以下形式捕获:

  • (call/cc procedure)
  • (call-with-current-continuation procedure)

continuation以执行诀方式表示,可以施用在0或者多个参数之上,然后返回这些参数作为结果。

continuation可以用来实现:

  • nonlocal exists
  • backtracking
  • coroutines
  • multitasking

实现上,cotinuation可以表现为执行诀加上执行诀的启动记录。

形式(dynamic-wind in body out)

Section 5.7. Delayed Evaluation

语法形式(delay expr),可以用来延迟执行,其返回一个promise。对应的(force promise)可以用来获取promise的结果。

例子略。

Section 5.8. Multiple Values

执行诀(values obj ...)接受任意数目的参数,并且将参数传给它的continuation。

例子:

(define head&tail
    (lambda (ls)
    (values (car ls) (cdr ls))))

(head&tail '(a b c)) ; 返回 a (b c)

执行诀(call-with-values producer consumer),其中producer和consumer必须为执行诀。call-with-values先无参数调用producer,然后以producer返回的值调用consumer。

例子略。

Section 5.9. Eval

执行诀(eval obj environment)可以动态对obj进行求值。其中environment可以由下面的执行诀返回:

  • (environment import-spec ...)
  • (null-environment version)
  • (scheme-report-environment version)

(本篇完)