Erreur de débutant
alain9118-Sep-2008/15:09:46+2:00
Bonjour,
Je débute en REBOl et j'ai voulu modifier un script des carrés qui glissent:

script de base:
rebol []

view center-face layout [
   origin 0x0 space 0x0 across
   style p button 60x60 [
      if not find [0x60 60x0 0x-60 -60x0]
         face/offset - empty/offset [exit]
      temp: face/offset
      face/offset: empty/offset
      empty/offset: temp
   ]

   p "E" p "G" p "A" p "O" return
   p "B" p "F" p "D" p "K" return
   p "C" p "H" p "I" p "L" return
   p "N" p "M" p "J"

   empty: p 200.200.200 edge [size: 0]
]

J'ai voulu modifier le code pour mettre en place une boucle. Ce qui donne :
rebol []

lettres: ["A" "B" "C" ... "O"]
view center-face layout [
   origin 0x0 space 0x0 across
   style p button 60x60 [
      if not find [0x60 60x0 0x-60 -60x0]
         face/offset - empty/offset [exit]
      temp: face/offset
      face/offset: empty/offset
      empty/offset: temp
   ]

   foreach lettre lettres [p lettre]

   empty: p 200.200.200 edge [size: 0]
]

l'interpréteur me retourne p has no value
near p lettre

Je n'arrive pas à trouver ce qui cloche. Quelqu'un aurait-il une solution ?
Didec18-Sep-2008/16:23:55+2:00
Un des gros avantages de Rebol c'est d'utiliser des dialectes. Il y en a plein dans le langage lui même. Parse, Layout, Secure et bien d'autres fonctions Rebol interprète le block de données qui suit comme un dialecte.

Une erreur classique est de confondre dans le source du programme ce qui est un dialecte et ce qui est du code Rebol.

Voici ton programme avec la partie Rebol et la partie VID mis en valeur, du point de vue de l'interpréteur :

Légende : code Rebol - code VID

-----------------------

Lettres: ["A" "B" "C" ... "O"]
view center-face layout [

origin 0x0 space 0x0 across
style p button 60x60 [
if not find [0x60 60x0 0x-60 -60x0]
face/offset - empty/offset [exit]
temp: face/offset
face/offset: empty/offset
empty/offset: temp

]

foreach lettre lettres [p lettre]

empty: p 200.200.200 edge [size: 0]
]
Didec18-Sep-2008/16:26:23+2:00
Pardon, le même avec des retraits, j'espère :

Légende : code Rebol - code VID

-----------------------
Lettres: ["A" "B" "C" ... "O"]
view center-face layout [

origin 0x0 space 0x0 across
style p button 60x60 [
if not find [0x60 60x0 0x-60 -60x0]
face/offset - empty/offset [exit]
temp: face/offset
face/offset: empty/offset
empty/offset: temp

]

foreach lettre lettres [p lettre]

empty: p 200.200.200 edge [size: 0]

]
alain9118-Sep-2008/18:02:35+2:00
Merci pour ces précisions rapides et utiles.

Cependant dois-je comprendre que je ne peux pas insérer du code REBOL dans le code VID comme je le souhaitais?
guest218-Sep-2008/20:37+2:00
Si heureusement, on peut insérer du code rebol dans un block VID. Ton problème n'est pas là, ton problème c'est que le code que tu as inséré n'a aucune chance de produire le résultat escompté.

J'imgine que tu veux que:
>>foreach lettre lettres [p lettre]
produise en sortie un block du genre:
>>[ p "A" p "B" p "C" return p "X" p "Z" ...]

Tu es très loin du compte. Allez cherche un peu c'est pas si compliqué.
alain9118-Sep-2008/21:40:24+2:00
Merci pour cet encouragement qui m'incite à poursuivre ma recherche.
alain9120-Sep-2008/17:30:25+2:00
Victoire, j'ai trouvé la solution suivante qui me permet de faire une distribution aléatoire des lettres avant affichage.

Merci pour la piste sur la distinction entre dialecte VID et code REBOL.

rebol []

lettres: ["A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O"]
lettres: random lettres

t: []

while [not tail? lettres] [
   i: index? lettres
   lettre: first lettres lettres: next lettres
   t: compose [(t) p (lettre)]
   if (0 = remainder i 4) [
      t: compose [(t) return]
   ]
]

fin: [empty: p 200.200.200 edge [size: 0]]

tpl: [
   origin 0x0 space 0x0 across
   style p button 60x60 [
      if not find [0x60 60x0 0x-60 -60x0]
         face/offset - empty/offset [exit]
      temp: face/offset
      face/offset: empty/offset
      empty/offset: temp
   ]
]

t1: compose [(tpl) (t) (fin)]

view center-face: layout t1
Didec23-Sep-2008/12:43:03+2:00
Je vois avec plaisir que tu y es arrivé, presque sans notre aide. Bravo !!

Je me permet de te proposer une version un peu optimisée afin de te montrer une autre façon de faire la même chose et donc de perfectionner tes connaissances du langage.

rebol []

lettres: random ["A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O"]

lay: [
   origin 0x0 space 0x0 across
   style p button 60x60 [
      if not find [0x60 60x0 0x-60 -60x0]
         face/offset - empty/offset [exit]
      temp: face/offset
      face/offset: empty/offset
      empty/offset: temp
   ]
]

i: 0
foreach l lettres [
	i: i + 1   
	repend lay ['p l]
   	if 0 = remainder i 4 [append lay 'return]
]

append lay [empty: p 200.200.200 edge [size: 0]]


view center-face layout lay
Didec23-Sep-2008/14:31:53+2:00
Aller pour le plaisir, la même en image :

rebol []

; Image du puzzle
img: load http://salon-auto.web-sy.fr/2004/ferrari_f430_rouge.jpg

; Taille d'une pièce
but-size: img/size / 4

; Creation des pieces
pieces: []
for i 0 14 1 [
	; j'avoue que cette ligne n'est pas des plus lisibles, ça fait partie du plaisir de l'apprentissage que de la comprendre
	append pieces copy/part at img as-pair but-size/x * remainder i 4  but-size/y * to-integer i / 4 but-size
]

; On mélange
pieces: random pieces

; le reste du code est quasi le même que celui du puzzle avec les lettres sauf...
lay: [
	origin 0x0 space 0x0 across
	;... ici où ou réduit la taille du bord du bouton
	style p button but-size edge [size: 1x1] [
		;... et là ou il faut tenir compte de la taille variable du bouton selon la taille de l'image
		if not find reduce [0x1 * but-size 1x0 * but-size 0x-1 * but-size -1x0 * but-size]
		face/offset - empty/offset [exit]
		temp: face/offset
		face/offset: empty/offset
		empty/offset: temp
	]
]

i: 0
foreach l pieces [
	i: i + 1   
	repend lay ['p l]
   	if 0 = remainder i 4 [append lay 'return]
]

append lay [empty: p 200.200.200 edge [size: 0]]


view center-face layout lay


Merci pour l'entracte
alain9123-Sep-2008/14:37:44+2:00
C'est moi qui vous remercie pour ces encouragements efficaces, accompagnés d'une pointe d'humour appréciée.

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2