CS61A_lab14_macro

发布时间 2023-04-21 21:47:04作者: 哎呦_不想学习哟~

 

(define-macro (switch expr cases)
  (cons 'cond
    (map (lambda (case) (cons (eq? (eval expr) (car case))  (cdr case)))
            cases))
)

 

这段代码是一个用于 Scheme 语言的宏定义,可以将一系列的条件分支语句转化为 Scheme 的 cond 表达式。

下面是具体的解释:

1. `(define-macro (switch expr cases) ...)`:定义一个名为 switch 的宏,宏的参数为 expr 和 cases。

2. `(cons 'cond ...)`:使用 Scheme 的 cons 函数将一个符号 'cond 和接下来的参数拼接在一起,以生成一个 cond 表达式。

3. `(map (lambda (case) (cons (eq? (eval expr) (car case)) (cdr case))) cases)`:使用 map 函数遍历 cases 中的每个分支,将其转化为一个 (condition . expression) 对,其中 condition 为一个布尔值,用于判断当前的表达式是否符合该分支的条件,而 expression 则为当前分支的表达式。

4. `(eq? (eval expr) (car case))`:eval 函数会求解表达式,将其结果返回。这里将 expr 作为参数传递给 eval 函数,以获取它的值。然后将其与当前分支的第一个元素(即该分支的条件)比较,以判断当前表达式是否符合该分支的条件。

5. `(cdr case)`:取出当前分支的第二个元素,即该分支的表达式,作为返回值。

最终,这个宏将根据传入的 expr 和 cases 参数生成一个 Scheme 的 cond 表达式,将 expr 的值与每个分支的条件进行比较,并执行符合条件的分支的表达式。

 

(eval expr) 是一个 Scheme 内置函数,用于求解并执行 Scheme 代码中的表达式 expr。它接收一个 Scheme 表达式作为参数,将其求值并返回结果。在这个宏定义中,我们使用 (eval expr) 来获取 switch 宏的第一个参数 expr 的值,从而对其进行条件判断,并执行符合条件的分支的表达式。

(switch x
  ((1) 'one)
  ((2) 'two)
  ((3) 'three)
  (else 'other))

;宏替换之后

(cond ((eq? x 1) 'one)
      ((eq? x 2) 'two)
      ((eq? x 3) 'three)
      (else 'other))

 如果前面有[ ` ] 才需要用逗号进行插值