IFT359 – Programmation fonctionnelle exercice backquote, unquote, unquote-splicing 1
Interpolation de listes quasiquote « ` » est aux listes ce que format est aux string quasiquote suspend l’évaluation comme quote, sauf qu’il peut contenir : –unquote «, » qui force l’évaluation –unquote-splicing » qui 1.force l’évaluation d’une expression –(Cette expression rune liste) 2.insère les éléments directement (i.e. sans les parenthèses)
Équivalence entre list/append/' et `x = 'x `,x = x `(x) = (list 'x) `(,x) = (list x) `(x,x) = (list 'x x) = (append x) = (append (list 'x) (list x) x)
Exemples Soit (define a 1) (define b 2) (define c 3) (define l '(x y z)) (let ([v 'x]) `(λ (,v) (*,v,v))) (λ (x) (* x x)) `(a b,c) (a b 4) c) (a x y z c) ((λ (x) `(,x ',x)) '(λ (x) `(,x ',x))) exercice '((λ (x) `(,x ',x)) '(λ (x) `(,x ',x)))
Exercice avec backquote 5 Définir combine, la procédure tail-recursive qui combine deux listes triées, et où deux éléments peuvent être égaux sans être identiques. Votre définition doit utiliser les notions que nous venons de voir. Pour simplifier le problème considérer que l’opérateur d’égalité est = et que celui de plus petit est < solution à la prochaine diapositive.
Exercice avec backquote 6 (define (combine ls1 ls2) (letrec ([iter (λ (acc liste1 liste2) (cond ((null? liste1) ((null? liste2) ((= (car liste1) (car liste2)) (iter liste1),(car liste2)) (cdr liste1) (cdr liste2))) ((< (car liste1) (car liste2)) (iter liste1)) (cdr liste1) liste2)) (else (iter liste2)) liste1 (cdr liste2)))))]) (iter null ls1 ls2)))
Exercice avec backquote 7 Définir ( permuter_m_n m n ls), la procédure tail-recursive qui permute les éléments m et n d’une liste. Votre définition doit utiliser les notions que nous venons de voir. (permuter 1 4 '(a b c d e f g)) '(a e c d b f g) solution sur la prochaine diapositive
Exercice avec backquote 8 Définir ( permuter_m_n m n ls) (define (permuter m n ls) (letrec ([iter (λ (reste acc1 acc2 m n) (cond ((>= m 0) (iter (cdr reste) (cons (car reste) acc1) acc2 (- m 1) (- n 1))) ((>= n 0) (iter (cdr reste) acc1 (cons (car reste) acc2) m (- n 1))) (else (cdr acc1)),(car (cdr acc2)),(car (iter ls null null m n)))