[Tuto] Coder proprement un script en TCL
#1
Bonsoir à tous,

Je vous propose ce soir un petit tuto, car en relisant certains scripts je me dis que parfois ce serait pas du luxe.
Je vais commencer par les règles le plus importantes et quelques petites conventions bien pratique, les réflexes à acquérir, bref, l'indispensable.
Et puis je vais terminer par les trucs un peu moins importants, les petites astuces, etc.


I - Avant de commencer à coder (pensez à préparer du café)
Choisissez un nom évocateur pour votre script c'est toujours utile.
Faites une petit cadre tendance de commentaires en haut de votre script afin d'indiquer le nom du script, son ou ses auteurs (et leurs emails), son utilité, éventuellement sa version et un petit changelog, bugs connus, à faire, etc.
Le tout ne dépassant idéalement pas les 80 colonnes, j'y reviendrai un peu plus tard.

Un bon exemple serait :
TCL
################################################################################
# script.tcl v18.0 par Mareo (mareoh@gmail.com)                                #
# LICENSE : GNU GPLv3 (lien vers le texte de la license qui passe pas)         #
#                                                                              #
#           Encodage : UTF-8      Taille des tabulations : 6 colonnes          #
#                                                                              #
#------------------------------------------------------------------------------#
#                                  Description                                 #
#------------------------------------------------------------------------------#
# Ce script est juste là pour servir d'exemple à mon tuto...                   #
#                                                                              #
#------------------------------------------------------------------------------#
#                              /!\ Attention /!\                               #
#------------------------------------------------------------------------------#
#           Une version de TCL supérieure ou égale à 8.5 est requise           #
#              pour que ce script puisse fonctionner correctement.             #
#                                                                              #
#                    (c'est bien d'indiquer la raison ici)                     #
#------------------------------------------------------------------------------#
#                                 Installation                                 #
#------------------------------------------------------------------------------#
# Ajoutez à la fin du fichier 'eggdrop.conf' l'instruction suivante :          #
#  source -encoding utf-8 "chemin/vers/script.tcl"                             #
#                                                                              #
# Vous pouvez également modifier quelques options plus bas                     #
#------------------------------------------------------------------------------#
#                                                                              #
# [ TODO ]                                                                     #
#  - Faire un vrai script                                                      #
#  - Faire du café                                                             #
#  - Taper Artix                                                               #
#                                                                              #
# [ CHANGES ]                                                                  #
#  * 24/03/2010 v18.0                                                          #
#      Correction d'un bug qui empêchait de voter.                             #
#      Ajout d'une fonction pour remplir sa fiche d'imposition.                #
#                                                                              #
#  [...] (plein de truc mais on s'en fiche)                                    #
#                                                                              #
#  * 24/03/1992 v1.0                                                           #
#      Première version stable.                                                #
#                                                                              #
#  * 24/06/1992 v0.1                                                           #
#      Début du developpement.                                                 #
#                                                                              #
################################################################################



Bon vous êtes pas obliger de raconter votre vie comme je le fais, mais si votre script est conséquent c'est toujours bien de faire un truc informatif,
la longueur des tabulation et l'encodage ça aide vraiment les gens qui vous relisent, alors si vous connaissez ces infos hésitez pas à les mettre.

Bon ceci fait passons à un autre incontournable, j'ai nommé le namespace

II - Avant de commencer à penser à coder (en préparant le café)

Certaines personnes aiment bien nommer leurs procédure "script:action", outre le fait que ça fait un nom à rallonge, c'est pas très judicieux, en effet autant utiliser correctement les outils que nous avons à notre disposition.
Pour rappel, voici la page du manuel sur les namespace

Pour ça c'est très simple, il suffit de mettre son script entre :
TCL
namespace eval "script" {
	(ton script qui déchire grave)
}



Et magie tout fonctionne ! Ça va être très pratique quand nous aborderont la désinstallation du script Smile

En attendant, il faut juste penser à inclure le chemin complet des commandes dans les bind, exemple :
TCL
namespace eval "script" {
	proc irc_uneputaindeproc { s_nick s_uhost s_hand s_chan s_msg } {
		(un putain de code)
	}
 
	bind PUBM - "*" [namespace current]::irc_uneputaindeproc
	(ou)
	bind PUBM - "*" script::irc_uneputaindeproc
}



Si vous oubliez le [namespace current]:: ou le script:: ça risque pas de marcher, vous pouvez choisir l'un ou l'autre. Ma préférence va pour le [namespace current]:: ça facilite la vie si vous modifiez le nom du namespace.

III - Pendant que vous commencez à coder (en buvant le café)

Bon, vous aurrez remarqué que mes variable sont très étrangement préfixées d'un "s_" enigmatique. J'en arrive à une deuxième règle très importante à mes yeux puisqu'elle vous permet de remarque tout de suite l'erreur typique du débutant, à savoir appliquer des fonction de string sur des list et inversement.
Le principe est simple, si votre variable est destinée à contenir une chaîne de caractère (string) préfixez là d'un "s_", si elle doit contenir une liste d'un "l_", un tableau (array) "a_" un entier (integer) "i_" ou un dictionnaire "d_", rien de très sorcier et ça améliore vraiment la lisibilité de vos sources, c'est toujours bien d'en parler quelque part au début de votre script, afin que les lecteurs comprennent l'astuce et puisse en bnéficier eux aussi Smile
Exemple :
TCL
################################################################################
#                                  ATTENTION                                   #
#------------------------------------------------------------------------------#
# Vous n'avez pas besoin de modifier ce qui suit, à moins que vous ne          #
# souhaitiez changer le comportement de ce script.                             #
#------------------------------------------------------------------------------#
# Tcl étant un langage non typé, il a été choisi de préfixer chaque variable   #
# par le type de la valeur qu'elle contient  :                                 #
#  "s_" pour une chaîne de caractère (string)                                  #
#  "i_" pour un entier (integer)                                               #
#  "l_" pour une liste (list)                                                  #
#  "d_" pour un dictionnaire (dict)                                            #
#  "a_" pour un tableau (array)                                                #
################################################################################
namespace eval "script" {
	# C'est toujours bien de mettre ceci pour être sur que la version de TCL
	# soit bien égale ou supérieure à 8.5
	package require Tcl 8.5
 
	proc irc_uneputaindeproc { s_nick s_uhost s_hand s_chan s_msg } {
		set l_argument [split $s_msg " "]
		switch -exact -nocase -- [lindex $l_argument 0] {
			(des trucs pas interessants)
		}
}


TCL
namespace eval "script" {
	proc irc_uneputaindeproc { s_nick s_uhost s_hand s_chan s_msg } {
		switch -exact -nocase -- [lindex $s_msg 0] {
			# vous la voyez la grosse erreur sur la ligne juste au dessus ?
			# si non, voyez un opticien, une fonction dont le nom commence par
			# un "l" appliquée à une chaîne franchement c'est moche !
			(des trucs pas interessants)
		}
}



Bon j'ai la flemme de faire la suite donc ce sera pour plus tard, et puis j'ai fini mon café donc faut que j'aille m'en refaire.

La suite portera sur la désinstallation propre des scripts et sur quelques truc sympa à faire avec les namespace.
Après je consacrerais une petite partie sur les fonctions de traitement de chaîne et de liste.
Ensuite je pense faire un petit tuto sur les dictionnaires parce que c'est le bien (à mort les tableau !)
Et je terminerai peut être avec un putain de script d'exemple top moumoute pour voir comment on fait des API propres (ou pas).

Sur ce bonne nuit.
Répondre Avertir


Messages dans ce sujet
[Tuto] Coder proprement un script en TCL - par Mareo - 22/03/2010, 23:38
RE: [Tuto] Coder proprement un script en TCL - par heretoc - 23/03/2010, 11:59

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté