Racket 编程

1 部分 · Racket 核心

控制流

控制流

掌握条件表达式、循环构造、let 绑定和 local 定义。

条件表达式

#lang racket

;; if 表达式
(if (> 5 3)
    "yes"
    "no")    ; => "yes"

;; cond 表达式(多分支)
(define (classify n)
  (cond
    [(< n 0)  "negative"]
    [(= n 0)  "zero"]
    [else     "positive"]))

(classify -3)  ; => "negative"
(classify 0)   ; => "zero"
(classify 7)   ; => "positive"

when 与 unless

(when (> x 0)
  (displayln "positive")
  x)

(unless (null? lst)
  (displayln (length lst)))

let 绑定

;; let:并行绑定
(let ([x 10]
      [y 20])
  (+ x y))   ; => 30

;; let*:顺序绑定
(let* ([x 10]
       [y (* x 2)])
  (+ x y))   ; => 30

;; letrec:递归绑定
(letrec ([even? (lambda (n)
                  (if (= n 0) #t (odd? (- n 1))))]
         [odd?  (lambda (n)
                  (if (= n 0) #f (even? (- n 1))))])
  (even? 10))  ; => #t

循环

Racket 主要通过递归实现循环,但也提供了命令式循环:

;; for 循环
(for ([i '(1 2 3 4 5)])
  (displayln i))

;; for-list:收集结果
(for/list ([i '(1 2 3 4 5)])
  (* i i))   ; => '(1 4 9 16 25)

;; for-sum
(for/sum ([i '(1 2 3 4 5)])
  i)         ; => 15

小结

Racket 的控制流以表达式为核心。ifcond 处理分支,let 系列管理局部绑定,for 系列处理迭代。