2016-10-27 2 views
2

J'ai le code de facteur suivant dans un fichier:Comment puis-je persister un changement de répertoire en dehors d'un script shell dans Factor?

IN: set-work-dir 
USING: shell ; 
CONSTANT: work-dir "/code" ! I also tried "c:/code" and "c:\\code"--same error 
work-dir cd 

Lorsque je tente d'exécuter le script de facteur je reçois cette erreur:

C:\>/usr/bin/factor/factor /usr/bin/factor/work/set-work-dir.factor 
Generic word absolute-path does not define a method for the fixnum class. 
Dispatching on object: 47 
(U) Quotation: [ c-to-factor => ] 
    Word: c-to-factor 
(U) Quotation: [ [ (get-catchstack) push ] dip call => (get-catchstack) pop* ] 
(O) Word: command-line-startup 
(O) Word: run-script 
(O) Word: set-current-directory 
(O) Method: M\ object absolute-path 
(O) Word: no-method 
(O) Method: M\ object throw 
(U) Quotation: [ 
     OBJ-CURRENT-THREAD special-object error-thread set-global 
     current-continuation => error-continuation set-global 
     [ original-error set-global ] [ rethrow ] bi 
    ] 

je peux obtenir ce à courir si au lieu de USING: shell ; J'ai USING: io.files.private mais le changement de répertoire n'est pas conservé en dehors de l'exécution du script. Je suppose que l'utilisation de shell provoquera la persistance du changement de répertoire - ce que je réalise peut être une mauvaise supposition. Comment puis-je écrire un script pour changer le répertoire et que le changement de répertoire persiste en dehors du script?

Windows 7 (Oui, je sais que le séparateur de dir sur Windows est généralement \ et j'ai essayé \ 'aussi. Mais / fonctionne réellement sur Windows aussi. En plus le chemin fonctionne quand j'utilise io.files.private).

facteur 0,98 x86.64 (1788, tête/maître-e187d63d3c, Mar 18 02:14:22 2016 oct) [Microsoft Visual C++ 190023506] sur les fenêtres

+0

Ceci est dû à la conception de l'OS sous-jacent, pas un défaut de Factor. Les processus enfants ne peuvent pas modifier le CWD du processus parent, ni sous Windows, ni sous Linux, et probablement la plupart des systèmes d'exploitation existants. Il y a probablement des hacks qui pourraient fonctionner, mais le mieux serait d'appeler votre programme Factor à partir d'un script batch, de retourner le répertoire à la sortie et de faire changer le WD par le script. Sous Windows, je pense que les fichiers .bat ou .cmd s'exécutent par défaut dans le même shell. Pour Linux (et je pense que PowerShell) c'est l'inverse, vous devez spécifier que vous voulez le même shell. –

Répondre

1

Le travail cd existe dans deux Vocabs. Lequel appellera cd dépend de ce que vous êtes USING:. Si shell alors shell:cd est appelée si io.files.private alors io.files.private:cd est appelée. Vous pouvez bien entendu utiliser le nom complet.

Bien que le mot io.files.private:cd ne doit pas être utilisé par le code utilisateur car le nom du vocabulaire se termine par .private qui indique que le mot ne fait pas partie de l'interface publique. Au lieu d'utiliser set-current-directory:

IN: scratchpad "/tmp" set-current-directory 
IN: scratchpad "." absolute-path . 
"/tmp" 

Le changement ne persistera pas après le processus de facteur se termine.

+0

Ouais je soupçonne que le processus Factor se terminant est le détail saillant ici. Mais merci quand même. –