2 votes

Comprendre une macro

Si je comprends bien la macro écrite ci-dessous ; La macro prend 3 arguments et produit une structure avec un constructeur qui accepte 3 arguments. Je peux deviner que la ligne qui suit immédiatement la définition de la macro crée une structure qui ressemble à.. :

(struct x (+ y x))

Je ne comprends pas comment fonctionnent les deux lignes qui suivent. Il semble que y soit lié à un x struct mais n'est-ce pas appeler le constructeur avec un argument de trop ?

(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))

Je ne vais pas vous ennuyer et vous demander comment fonctionne la dernière ligne, en espérant une clarification sur la y variable me conduira à la réponse donnée de 4.

1voto

soegaard Points 6541

Ce qui est déroutant ici, c'est que le nom d'un champ peut être le même que celui de la structure. Prenons cet exemple :

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

Así que (binary-search (+ x y)) résulte en :

(struct x (+ y x))

qui définit un x struct qui a un nom également nommé x .

La ligne

(define y (x 1 2 3))

crée une x-struct où :

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

Maintenant (x-+ y) obtient le + domaine de y qui est 1 et (x-x y) obtient le x domaine de y qui est de 3. Cela signifie que (+ (x-+ y) (x-x y)) est égal à 4.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X