Macros 理解宏

Macros 理解宏,macros,racket,Macros,Racket,正如我所理解的,宏写在下面;宏接受3个参数,并生成一个包含接受3个参数的构造函数的结构。我可以猜,紧跟在宏定义后面的一行创建了一个结构,它看起来像: (结构x(+y x)) 我无法理解接下来的两条线是如何工作的。看起来y被绑定到一个x结构,但它不是用一个太多的参数调用构造函数吗 (define-syntax binary-search (syntax-rules () [(binary-search (node left right)) (struct left (node right x

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

(结构x(+y x))


我无法理解接下来的两条线是如何工作的。看起来y被绑定到一个x结构,但它不是用一个太多的参数调用构造函数吗

(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
因此
(二进制搜索(+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)
获取
y
x
字段,该字段为3。
这意味着
(+(x-+y)(x-x y))
的计算结果为4。

字段名/结构名相同时,我实际上没有问题。然而,现在您已经解释了它,让我感到困惑的是+作为函数的概念在x中变得“丢失”,从而有效地将+转换为参数名。我最初将结构x视为用于添加的别名。@awsunit
+
只是一个标识符。在
中(+ab)
+
是一个变量。和
(let(+-)(+23));=>-1
binary search和
struct
都是宏,因此它们的参数不能正常计算<代码>+并不比
x
更特殊,因为两者都是标识符。