Fonction est-dans? en TinyScheme pour Gimp

17 08 2010

TinyScheme, le langage de script de Gimp, manque de fonctions. C’est d’ailleurs pour ça qu’il est préfixé “Tiny”.

Voici la fonction est-dans?.

La fonction est-dans?

La fonction est-dans? vérifie si une valeur se trouve dans une liste ou non.

Elle s’utilise de la façon suivante :

(est-dans? valeur liste)

Où :

  • valeur est une valeur de type quelconque (chaîne, caractère, entier etc.),
  • liste est une liste d’éléments, si possible du même type que valeur mais ce n’est pas obligatoire.

Elle retourne #t si valeur existe dans liste et #f dans le cas contraire.

Cette fonction est pratique sous Gimp pour déterminer si une extension se trouve dans une liste d’extensions autorisées :

(est-dans? ".jpeg" '(".png" ".gif" ".tiff"))

Code source

Voici le code source de la fonction est-dans?

; Teste si une valeur se trouve dans une liste
(define (est-dans? valeur liste)
  (cond
    ; Si la liste est nulle, la valeur ne peut pas s’y trouver
    ((null? liste) #f)

    ; Si le premier élément de la liste est égal à la valeur on retourne vrai
    ((equal? valeur (car liste)) #t)

    ; Sinon on recherche la valeur dans le reste de la liste
    (else (est-dans? valeur (cdr liste)))
  )
)

Fonctionnement

Une fonction récursive

La fonction est-dans? utilise la récursivité pour rechercher un élément dans une liste. Si vous n’appréciez pas cette gymnastique de l’esprit, vous n’avez pas tiré le bon numéro : les dialectes à la Lisp (Lisp, Scheme, TinyScheme etc.) en usent et en abusent.

Le principe dans cette fonction est de comparer le premier élément de la liste avec l’élément recherché et, s’il n’y a pas concordance, de relancer la fonction avec la liste privée de son premier élément.

Par exemple, pour l’appel

(est-dans? ".jpeg" '(".png" ".gif" ".tiff"))

TinyScheme générera les appels suivants :

(est-dans? ".jpeg" '(".png" ".gif" ".tiff"))
  ↳ (est-dans? ".jpeg" '(".gif" ".tiff"))
      ↳ (est-dans? ".jpeg" '(".tiff"))
          ↳ (est-dans? ".jpeg" '())

Cond : un if…then…else if…the…else…

La fonction utilise l’instruction cond. Elle permet d’enchaîner des tests et de limiter l’imbrication des parenthèses :

(cond
  ((test1) action1)
  ((test2) action2)
  …
  ((testN) actionN)
  (else actionELSE)
)

Dans la fonction est-dans?, l’instruction cond permet d’indiquer les 2 cas terminant la récursion et l’appel récursif.

Lors de l’écriture d’une fonction récursive, il faut toujours définir une ou des conditions de fin de la récursion. En leur absence c’est le plantage assuré car chaque appel récursif consomme de la mémoire.

Retour de fonction

L’instruction cond, comme beaucoup d’autres fonctions, retourne la valeur de l’action exécutée en dernier.


Actions

Information

One response

18 08 2010
Parcours d’arborescence en TinyScheme pour Gimp « Le blog de Zigazou

[…] est-dans? présentée dans le billet Fonction est-dans? en TinyScheme pour Gimp, […]

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s




%d blogueurs aiment cette page :