Macros 理解宏
正如我所理解的,宏写在下面;宏接受3个参数,并生成一个包含接受3个参数的构造函数的结构。我可以猜,紧跟在宏定义后面的一行创建了一个结构,它看起来像: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
(结构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
更特殊,因为两者都是标识符。