Quelqu'un sait-il comment implémenter le Y-combinator dans Scheme, en particulier avec une évaluation paresseuse et un argument supplémentaire ? Je crois savoir que Scheme (promise ?) (delay) et (force) fournissent un support pour l'évaluation paresseuse.
Je crois comprendre que le Y-combinator avec application est le suivant, mais il ne fonctionnera pas dans Scheme en raison de l'évaluation de l'ordre applicatif par défaut.
((lambda (f)
((lambda (x) (f (x x)))
(lambda (x) (f (x x)))))
(lambda (r) (r)))
Il s'agit d'une solution suggérée (le Z-combinateur), mais elle utilise une autre fonction lambda avec des arguments comme solution :
;; Z-combinator
(define Z
(lambda (f)
((lambda (g) (f (g g)))
(lambda (g) (f (lambda args (apply (g g)
args)))))))
;Value: z
((Z (lambda (r)
(lambda (x)
(if (< x 2)
1
(* x (r (- x 1))))))) 5)
;Value: 120
;; end Z-combinator
Mise à jour en fonction des solutions
Le Y-combinator est le suivant :
;; Y-combinator
(define Y
(lambda (f)
((lambda (x) (f (delay (x x))))
(lambda (x) (f (delay (x x)))))))
;Value: y
;; end Y-combinator
;; Non tail recursive
((Y (lambda (r)
(lambda (x)
(if (< x 2)
1
(* x ((force r) (- x 1)))))))
5)
;Value: 120
;; Tail - recursive
((Y (lambda (r)
(lambda (x acc)
(if (< x 2)
acc
((force r) (- x 1) (* x acc))))))
5 1)
;Value: 120
J'apprécie vos conseils !