Bonjour,
J'essaye d'implementer l'algo d'un producteur avec les continuatuions
Voila mon code:
Pour utiliser le producteur voici le code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 (define producer (local [(define resume (box false))] (lambda (real-send) (local [(define real-sendb (box real-send)) (define send (lambda (value-to-send) (let/cc k (begin (set-box! resume k) ((unbox real-sendb) value-to-send)))))] (if (unbox resume) (begin (set-box! real-sendb real-send) ((unbox resume) 'dummy)) (begin (send 'providence) (send 'houston) (send 'bangalroe)))))))
Mais voila le problem c'est que real-sendb utilse la premiere continuation passe en parametre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 (printf "Get 1 ~a" (let/cc k (route-producer k))) (printf "Get 2 ~a" (let/cc k (route-producer k)))
real-sendb est donc toujours egale, et ce malgres mon (set-box! real-sendb real-send) a:
La solution est donc:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 (lambda (k-value) (prinf "Get 1 ~a" value))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 (define route-producer (local [(define resume (box false))] (lambda (real-send) (local [(define real-sendb (box real-send)) (define send (lambda (value-to-send) (set-box! real-sendb (let/cc k (begin (set-box! resume k) ((unbox real-sendb) value-to-send))))))] (if (unbox resume) ((unbox resume) real-send) (begin (send 'providence) (send 'houston) (send 'bangalroe)))))))
Mais voila je ne comprend pas pourquoi ma premiere solution ne marche pas.
Merci
Partager