Je viens de commencer avec Scheme. J'ai des problèmes avec l'impression sur la console. Un exemple simple d'impression de liste:
(define factorial
(lambda (n)
(cond
((= 0 n) 1)
(#t (* n (factorial (- n 1)))))))
Je veux imprimer n
, chaque fois que la fonction est appelée. J'ai pensé que je ne pouvais pas faire ça dans la même fonction? Dois-je appeler une autre fonction pour pouvoir imprimer?
L'impression dans Scheme fonctionne en appelant display
(et éventuellement, newline
). Puisque vous voulez l'appeler séquentiellement avant/après quelque chose d'autre (qui, dans un langage fonctionnel (ou dans le cas de Scheme, Functional-ish) n'a de sens que pour les effets secondaires des fonctions appelées), vous devez normalement utiliser begin
, qui évalue tour à tour ses arguments, puis renvoie la valeur de la dernière sous-expression. Cependant, lambda
contient implicitement une telle expression begin
-.
Donc, dans votre cas, cela se passerait comme ceci:
(lambda (n)
(display n) (newline)
(cond [...]))
Deux remarques:
(define (factorial n) [...])
comme raccourci pour (define factorial (lambda (n) [...]))
.factorial
interdit optimisation des appels de queue , donc le programme utilisera pas mal d'espace de pile pour des valeurs plus grandes de n. Il est cependant possible de le réécrire sous une forme optimisable à l'aide d'un accumulateur.Si vous ne souhaitez imprimer n
qu'une seule fois, lorsque l'utilisateur appelle la fonction, vous devrez en effet écrire un wrapper, comme ceci:
(define (factorial n)
(display n) (newline)
(inner-factorial n))
Et puis renommez votre fonction en inner-factorial
.