了解宏

Understanding a macro

据我理解下面写的宏;该宏接受 3 个参数并生成一个结构,该结构具有接受 3 个参数的构造函数。我可以猜测紧跟在宏定义之后的行创建了一个结构,它看起来像:

(struct x (+ y x))

我不明白后面的两条线是如何工作的。看起来 y 绑定到 x struct,但它不是用太多参数调用构造函数吗?

(define-syntax binary-search
 (syntax-rules ()
 [(binary-search (node left right))
 (struct left (node right x))]))

(binary-search (+ x y))
(define y (x 1 2 3))

(+ (x-+ y) (x-x y))

我不会打扰并询问最后一行是如何工作的,希望对 y 变量的澄清将使我得到给定的答案 4.

这里令人困惑的是字段名称可以与结构名称相同。 考虑这个例子:

#lang racket
(struct foo (foo) #:transparent)
(foo 42)            ; => (foo 32)
(foo-foo (foo 42))  ; => 32

所以 (binary-search (+ x y)) 结果是:

(struct x (+ y x))

定义了一个 x 结构体,该结构体有一个命名为 x.

(define y (x 1 2 3))

创建一个 x 结构,其中:

the + field stores 1,
the y field stores 2,
the x field stores 3.

现在(x-+ y)获取y+字段,即1 (x-x y) 获取 yx 字段,即 3。 这意味着 (+ (x-+ y) (x-x y)) 的计算结果为 4.