OVH Cloud OVH Cloud

goto en python

36 réponses
Avatar
jean-michel
Dans le niouze anglais, j'ai trouvé 2 messages qui intéresseront ceux qui
veulent le GOTO en python.
Beurk diront certains.
Mais ceux qui essayent de migrer de vieilles appli en GW-Basic ou autre
pourraient bien apprécier...

J'ai pas tout compris dans le premier, je vous le livre tel que:
----------------------------------------------------------------------------
-------------------------------
On peut utiliser le goto seulement si on programme avec des numéros de
ligne:
"""
10 import sys
20 real_stdout = sys.stdout
30 class fake_stdout(object): pass
40 fake_stdout.write = lambda x, y: None
50 sys.stdout = fake_stdout()
60 import this
70 sys.stdout = real_stdout
80 d = {}
90 c = 65
100 i = 0
110 d[chr(i+c)] = chr((i+13) % 26 + c)
120 if i == 26: goto(150)
130 i += 1
140 goto(110)
150 if c == 97: goto(180)
160 c = 97
170 goto(100)
180 print "How zen it is:"
190 print "".join([d.get(c, c) for c in this.s])
"""
z = dict((int(x[0]), " ".join(x[1:])) for x in (y.split() for y in (__doc__
or _).strip().splitlines())); k = [0] + sorted(z.keys()); m = dict((b,a) for
a,b in enumerate(k)); l = k[1]

def goto(n): global l; l = k[m[n]-1]

while l and l <= k[-1]: exec z[l]; l = l != k[-1] and k[m[l]+1]
--
Michael Hoffman
----------------------------------------------------------------------------
-------------------------------
Le deuxième est un lien vers un module qui ajoute le goto à python.
http://entrian.com/goto/index.html
Je n'ai pas vérifié si ça marche.
----------------------------------------------------------------------------
-------------------------------
++jm

10 réponses

1 2 3 4
Avatar
Do Re Mi chel La Si Do
Ouaip, on dirait ta signature




MDR


--
Michel Claveau



Avatar
bruno modulix
Alex Marandon wrote:
On 2005-02-11, bruno modulix wrote:

Dans le même ordre d'idées, quelqu'un connait une asctuce pour avoir un
switch/case ?



[...]

3/ (OO) utiliser le polymorphisme pour avoir un 'dispatch' dynamique

class Case1:
def la_fonction(self, ...): pass

class Case2:
def la_fonction(self, ...): pass

class CaseN:
def la_fonction(self, ...): pass

# obj est une instance de Case1 ou de Case2 ou ... de CaseN

obj.la_fonction(...)



Je ne vois pas l'intérêt de faire ça, car il faudra bien un branchement
conditionnel pour choisir la classe à instancier pour obj, non ?


Si c'est juste pour remplacer un switch dans du code procédural, ça n'a
effectivement *aucun* intérêt !-)

Par contre, si tu considère le cas suivant (désolé de ressortir la TALC
des exemples débiles de POO, mais j'ai la flemme d'en inventer un autre...)

--------------------
Version procédurale:
--------------------
def draw_circle(center_pos, radius):
...

def draw_rect(top_pos, width, height):
....

def draw_line(start_pos, end_pos):
....


items = [{'type':'circle', 'radius' : 1.25, 'center_pos': (5, 22)},
{'type':'rect', 'top_pos' : (21,13), 'width':42, 'height':33},
{'type': 'line', 'start_pos' : (12,12), 'end_pos' : (22, 22)}]

def draw_items(items):
for item in items:
if item['type'] == 'circle':
draw_circle(item['center_pos'], item['radius'])
elif item['type'] == 'rect':
draw_rect(item['top_pos'], item['width'], item['height'])
elif item['type'] == 'line':
draw_line(item['start_pos'], item['end_pos'])
else:
raise "unknown type : ", item['type']

--------------
version objet:
--------------

class Line:
def __init__(self, start_pos, end_pos):
...
def draw(self):
...

class Rect:
def __init__(self, top_pos, width, height):
...
def draw(self):
...
class Circle:
def __init__(self, center_pos, radius):
...
def draw(self):
...

items = [Line((11,22), (33,44)),
Circle((42,33), 5),
Rect((34,43), 12, 25)]

def draw_items(items):
for item in items:
item.draw()


On voit bien que le switch se fait (implicitement) par polymorphisme.


--
bruno desthuilliers
ruby -e "print ''.split('@').collect{|p|
p.split('.').collect{|w| w.reverse}.join('.')}.join('@')"
--



Avatar
bruno modulix
Alex Marandon wrote:
On 2005-02-11, bruno modulix wrote:
[...]

z = dict((int(x[0]), " ".join(x[1:])) for x in (y.split() for y in (__doc__
or _).strip().splitlines())); k = [0] + sorted(z.keys()); m = dict((b,a) for
a,b in enumerate(k)); l = k[1]



[...]

Non, sérieusement, à quoi ça sert que le BDFL se donne la peine de nous
pondre un langage lisible, si c'est pour en faire une pareille horreur?
C'est de la perversité, là !-)



Ouaip, on dirait ta signature ;-)


<troll>
Ahh... Je me demandais aussi si quelqu'un allait réagir !-)

Tu la veux en Python ?

python -c "print '@'.join('.'.join([w[::-1] for w in p.split('.')])
for p in ''.split('@')])"

Je ne suis pas sûr que ce soit tellement plus clair, note bien !-)
</troll>

--
bruno desthuilliers
ruby -e "print ''.split('@').collect{|p|
p.split('.').collect{|w| w.reverse}.join('.')}.join('@')"
--



Avatar
bruno modulix
jean-michel wrote:
"bruno modulix" a écrit dans le message de
news:420c812a$0$13407$

Non, sérieusement, à quoi ça sert que le BDFL se donne la peine de nous
pondre un langage lisible, si c'est pour en faire une pareille horreur?
C'est de la perversité, là !-)



Non, c'est simplement que parfois si tu ne peux pas reprendre une vieille
appli qui ne tourne plus que sur un vieux PC msdos (qui justement vient de
tomber en rade...), tu n'a plus qu'à trouver la solution miracle pour migrer
le + vite possible.


Cela implique-t'il de devoir coder aussi salement qu'en GW-Basic ?-)
Sérieusement, il n'est de toutes façon pas possible de porter le code
'ligne à ligne', donc autant en profiter pour faire propre, non ?

Pardon ? On n'a pas le temps ?

Bon, tant pis, on passera deux fois plus de temps à débugguer cette
horreur qu'à faire la migration proprement, mais c'est vous le chef,
chef !-)

Les applications héritées sont une réalité en entreprise.


Je ne le sais que trop bien, hélas :(

Plus personne n'en
veux (d'où le beurk), sauf l'utilisateur évidemment.

Cela dit, si tu me trouves un algorithme de migration qui me sort un
programme python tout joli à partir d'un vieux code en cobol ou en basic
plein de gotos, je suis (très) intéressé...;-)


Je passe !-)

--
bruno desthuilliers
ruby -e "print ''.split('@').collect{|p|
p.split('.').collect{|w| w.reverse}.join('.')}.join('@')"
--


Avatar
jean-michel
Sérieusement, il n'est de toutes façon pas possible de porter le code
'ligne à ligne', donc autant en profiter pour faire propre, non ?

Si si c'est possible !

Pas à la main évidemment. Tu traites les sources initiaux (par exemple en
basic) avec un utilitaire (en python, of course), et tu obtiens un source
résultant. S'il le source initial n'est pas trop varié, et si tu peux
respecter la structure algorithmique initiale, ça marche !
J'ai déjà eu à le faire pour migrer du cobol et ça m'a permis de migrer une
application de plus de 6000 programmes en moins de deux mois. Impossible à
la main ! Et pourtant, le code a bien été porté 'ligne à ligne'.

++jm

Avatar
Do Re Mi chel La Si Do
Salut !


Pour les fanatiques du GOTO, je signale l'existence du langage GOTO++ (GPP)
Plus de renseignements, machine virtuelle, doc, etc, ici :
http://gpp.niacland.net

Exemple, un calcul de Pi :
ftp://gpp.niacland.net/gpp/archives/pi.gpp


@-salutations
--
Michel Claveau
Avatar
Loïc Joly
bruno modulix wrote:

Ouaip, on dirait ta signature ;-)



<troll>
Ahh... Je me demandais aussi si quelqu'un allait réagir !-)

Tu la veux en Python ?

python -c "print '@'.join('.'.join([w[::-1] for w in p.split('.')])
for p in ''.split('@')])"

Je ne suis pas sûr que ce soit tellement plus clair, note bien !-)


Merci, je vien de comprendre la différence entre Ruby et Python : Dans
les deux cas, on met des trucs illisibles, mais on ne les met juste pas
dans le même ordre...

</troll>


--
Loïc


Avatar
Gilles Lenfant
Dans le niouze anglais, j'ai trouvé 2 messages qui intéresseront ceux qui
veulent le GOTO en python.
Beurk diront certains.
Mais ceux qui essayent de migrer de vieilles appli en GW-Basic ou autre


Super !

Comment faire du Python (presque) aussi inmaintenable et illisible que
du GWBasic ;)

Au prochain épisode : comment se passer des classes, de la gestion des
exceptions, limiter les symboles à 2 caractères, limiter la mémoire
utilisable à 64Ko, etc, etc...

C'est beau le progrès !

Plus sérieusement, pour migrer une vieille (probablement plus de 20 ans)
application GWBasic en Python (ou autre langage digne de ce nom), il est
préférable de reprendre à zéro depuis les specs (if any). A long terme
cette approche est plus payante.

--
Gilles

pourraient bien apprécier...

J'ai pas tout compris dans le premier, je vous le livre tel que:
----------------------------------------------------------------------------
-------------------------------
On peut utiliser le goto seulement si on programme avec des numéros de
ligne:
"""
10 import sys
20 real_stdout = sys.stdout
30 class fake_stdout(object): pass
40 fake_stdout.write = lambda x, y: None
50 sys.stdout = fake_stdout()
60 import this
70 sys.stdout = real_stdout
80 d = {}
90 c = 65
100 i = 0
110 d[chr(i+c)] = chr((i+13) % 26 + c)
120 if i == 26: goto(150)
130 i += 1
140 goto(110)
150 if c == 97: goto(180)
160 c = 97
170 goto(100)
180 print "How zen it is:"
190 print "".join([d.get(c, c) for c in this.s])
"""
z = dict((int(x[0]), " ".join(x[1:])) for x in (y.split() for y in (__doc__
or _).strip().splitlines())); k = [0] + sorted(z.keys()); m = dict((b,a) for
a,b in enumerate(k)); l = k[1]

def goto(n): global l; l = k[m[n]-1]

while l and l <= k[-1]: exec z[l]; l = l != k[-1] and k[m[l]+1]


Avatar
Gilles Lenfant

Sans oublier la lenteur engendrée par la boucle d'exécution :-)

--
Gilles
Avatar
Bruno Desthuilliers
Salut !


Pour les fanatiques du GOTO, je signale l'existence du langage GOTO++ (GPP)
Plus de renseignements, machine virtuelle, doc, etc, ici :
http://gpp.niacland.net


Excellent ! Et moi qui pensait qu'on avait touché le fond de l'inutile
avec ook!

http://www.dangermouse.net/esoteric/ook.html
http://www.pvv.ntnu.no/~oyving/code/python/pook.py

1 2 3 4