[Core] Questions générales
trigram7-Jul-2011/12:19:08+2:00
J'ai plusieurs questions.

Comment faire pour afficher le numéro de version d'un script à l'intérieur d'un contexte ?

REBOL [
version: 0.1.0
]
ctx: context [
version: does [
print system/script/header/version
]
]


Et voici le résultat :

>> do %ctx.r
Script: "Untitled" (none)
>> ctx/version
** Script Error: Cannot use path on none! value
** Where: version
** Near: print system/script/header/version
>>


Ensuite, ma deuxième question est : comment faire pour appeler script avec do pour charger comme une librairie et ensuite lancer le script en tapant le nom et qu'il me lance un prompt.

Exemple:

REBOL []
my-ctx: context [

]

>> do %my-ctx.r
>> my-ctx
my-ctx>>


Je ne sais pas si il faut utiliser context ou pas ?
guest27-Jul-2011/14:07:11+2:00
*** 1ère question

c'est normal tu n'as pas lancé le script correctement.
la fonction 'DO ne tient pas compte du header.

>> launch %ctx.r
ou dans une console DOS/TTY
>> rebol.exe ctx.r

*** 2ième question

j'ai pas tout compris mais pour changer le prompt dans R2 il faut aller voir du côté de system/console/prompt

Dans R3 tu peux pas nativement, ou alors il faut créer ton propre interpréteur de commande.
un truc du genre.
forever [ prin ">>" print mold try [input]]
Philippe7-Jul-2011/14:24:27+2:00
Salut,

Voilà ce que je bidouillerais :
Exemple de script principal qui appelle ton contexte dans un autre script lib-interne.r :
REBOL [
  Title:   "tests-externe "
  Date:    7-Jul-2011
]

h: load/header %lib-interne.r  ; tu recuperes directement le header de la lib
do %lib-interne.r
print h/1/version
print ctx/version      ; idem au-dessus mais via le ctx
print ctx/version-ctx   ; le versionning interne du ctx 
halt


et pour %lib-interne.r :
REBOL [
  Title:   "lib interne"
  Date:    7-Jul-2011
  version: 0.0.1
]

ctx: context [
version: system/script/header/version
version-ctx: 0.0.2
]



Pour la question 2, je n'ai pas tout compris. Tu veux qu'au chargement de ta lib et de ton contexte, le prompt change ou qu'il y ait une autre console avec un autre prompt ?

===Philippe
trigram7-Jul-2011/15:23:53+2:00
Pour le point 2, je veux le comportement suivant :

>> do %rem.r
>> rem
Welcome to REBOL External Modules
version 0.1.0
rem>>
Philippe8-Jul-2011/9:28:09+2:00
Hello,

REBOL [
  Title:   "tests-externe "
  Date:    8-Jul-2011
]
do %lib-interne.r
halt  


et pour la lib-interne :

REBOL [
  Title:   "REBOL External Modules"
  Date:    8-Jul-2011
  version: 0.0.1
]


ctx: context [
print join {rem
Welcome to REBOL External Modules
version } system/script/header/version
system/console/prompt: "rem>>"
{.. puis le contexte ..}
]


===Philippe
Didec8-Jul-2011/13:33:45+2:00
Si j'ai bien tout compris, tu veux charger le script par do, mais ne l'exécuter que quand tu veux. Ca devient une sorte d'interpréteur de commandes. Mais alors il n'est utile que dans la console !

Le script %rem.r :
REBOL [
	title: "REM"
	version: 0.1.0
]

rem-ctx: context [
	; on sauve le prompt système et la version du script pendant qu'elle est accessible
	sys-prompt: system/console/prompt
	version: system/script/header/version

	; on sauve les fonctions redefinis
	sys-exit: :exit
	sys-add: :add
	sys-help: :help
	

	; Init du module
	init: does [
		print join "Welcome in REM v" version
		system/console/prompt: "rem>>"

		; On créé les fonctions de REM
		set 'add func [ a b] [print [a "+" b "=" a + b]]
	
		set 'help does [
			print "Commandes disponibles : Add, Help ou Exit"
		]
		
		set 'exit does [
			; restauration de l'environnement système
			system/console/prompt: sys-prompt
			exit: :sys-exit
			add: :sys-add
			help: :sys-help
		]
	]
]

; la fonction de lancement
set 'rem does [
	rem-ctx/init
]

Et une session console l'utilisant :
>> do %rem.r
>> add 5 4
== 9
>> rem
Welcome in REM v0.1.0
rem>>help
Commandes disponibles : Add, Help ou Exit
rem>>add 5 4
5 + 4 = 9
rem>>exit
>> add 5 4
== 9
>>
trigram8-Jul-2011/14:33:56+2:00
Ah ba oui, c'est exactement cela.
Très fort ce Didec !

Merci à Philippe et guest2 aussi.
Didec8-Jul-2011/14:36:19+2:00
Ca marche pas mal, mais si tu as un contexte en pleine évolution, il faut penser à mettre le code pour sauver/restaurer chaque fonctions créées qui écraserait celle de Rebol.

Voici une solution pour ne pas s'en préoccuper :
REBOL [
	title: "REM"
	version: 0.1.0
]

rem-ctx: context [
	; on sauve le prompt système et la version du script pendant qu'elle est accessible
	sys-prompt: system/console/prompt
	version: system/script/header/version

	; on y sauve les fonctions redéfinies par le module
	sys-funcs: []
	

	; Init du module : défini les fonctions de REM et sauve les fonctions existantes du sytème
	init: has [funcs] [
		print join "Welcome in REM v" version
		system/console/prompt: "rem>>"

		; On va créé les fonctions de REM
		; pour ça on récupère la listes des "membres" du contexte définis à partir de 'exit = fonctions du module
		funcs: find first self 'exit
		
		clear sys-funcs
		
		; pour chaque word! du contexte
		foreach f funcs [
			; Si c'est pas un mot du contexte global
			either unset? get/any in system/words :f [
				; on ajoute le code pour l'en enlever en sortie
				append sys-funcs reduce ['unset to-lit-word :f]
			] [
				; on ajoute le code pour remettre l'original en sortie (attention, on ne peut pas mettre la fonction directement, des fois que ce serait une native! action!)
				append sys-funcs reduce ['set to-lit-word :f 'pick reduce [get bind :f system/words] 1]
			]
			
			; maintenant on met notre fonction en place
			set to-lit-word :f get in self :f
		]
	]

	; fonction qui permet de quitter REM en restaurant les fonctions originales
	exit: does [	; existe dans Rebol
		; restauration de l'environnement système
		system/console/prompt: sys-prompt
		do sys-funcs
	]
	
	; fonctions du module
	rem: does [	; n'existe pas dans Rebol
		; Evite de relancer REM ce qui re-sauvegarderait les fonctions et donc celles de REM et non plus celles du système
		print "REM already running !"
	]
	
	add: func [ a b] [print [a "+" b "=" a + b]]	; existe dans Rebol
	
	sub: func [ a b] [print [a "-" b "=" a - b]]	; n'existe pas dans Rebol

	help: does [	; existe dans Rebol
		print "Commandes disponibles : Add, Help ou Exit"
	]
	
]

; la fonction de lancement
set 'rem does [
	rem-ctx/init
]
trigram8-Jul-2011/14:57:23+2:00
Voici le résultat à ma façon :

http://www.rebol.org/view-script.r?script=rem.r

Le but est de faire un outil comme gem. LDS de rebol.org est super mais pas du tout adapté pour le néophyte.
Enfin, à mon avis.

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2