Как я могу сохранить каталог изменений вне сценария оболочки в факторе?

У меня есть следующий код фактора в файле:

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

Когда я пытаюсь запустить скрипт из фактора, я получаю эту ошибку:

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
    ]

Я могу заставить это работать, если вместо USING: shell ; я имею USING: io.files.private но изменение каталога не сохраняется вне выполнения скрипта. Я предполагаю, что использование оболочки приведет к сохранению изменения каталога, что, как я понимаю, может быть неверным предположением. Как я могу написать сценарий, чтобы изменить каталог и сохранить изменение каталога вне сценария?

Windows 7 (Да, я знаю, что разделитель каталогов в Windows обычно \ и я попробовал '\' тоже. Но / на самом деле работает на Windows тоже. Кроме того, путь работает, когда я использую io.files.private).

Коэффициент 0,98 x86,64 (1788, Heads/ Master-e187d63d3c, Вт 18 октября 02:14:22 2016) [Microsoft Visual C++ 190023506] на окнах

1 ответ

Решение

cd Работа существует в двух словах. Который из cd звонить зависит от того, кто ты USING:, Если shell затем shell:cd называется если io.files.private затем io.files.private:cd называется. Конечно, вы можете использовать и полное имя.

Хотя io.files.private:cd слово не должно использоваться пользовательским кодом, потому что имя вокаба заканчивается на .private что означает, что слово не является частью общедоступного интерфейса. Вместо этого используйте set-current-directory:

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

Изменение не будет сохраняться после завершения процесса Factor.

Другие вопросы по тегам