web-dev-qa-db-fra.com

Impression de la console de schéma

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?

19
ercliou

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:

  1. Vous pouvez utiliser (define (factorial n) [...]) comme raccourci pour (define factorial (lambda (n) [...])).
  2. La façon dont vous implémentez 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.

34
fnl