Я'начал учить себя Haskell, и для этого я'установил The Haskell Platform для Windows. На данный момент я использую WinGHCi
. Я узнал, что в ней есть команда :cd
, которая используется для смены каталога. Но вопрос в том, как мне узнать, в какой директории я сейчас нахожусь? Не зная этого, зачем мне менять каталог. Я много искал, но так и не смог найти ответ.
Пожалуйста, подскажите, есть ли способ узнать текущий рабочий каталог. Предпочтительно я хотел бы настроить командную строку так, чтобы она показывала текущий каталог, почти как консоль Linux.
Следуя предложению @Daniel', я сделал следующее:
.ghci
(я думаю, что это для Unix-подобных ОС), поэтому я создал файл ghci.conf
в папке C:\Users\Apelles\AppData\Roaming\ghc
, как указано здесь.ghci.conf
.ghci.exe
, который представляет собой консольное окно. Я заметил, что он загрузил несколько больше модулей, чем обычно загружал до этого. Вот снимок:Как вы можете видеть, он загружает больше модулей, и последняя строка говорит,
Can't parse prompt string. Используйте синтаксис Haskell.
Что это значит? Какая строка вызывает проблему (из следующего сценария)?
let cur fill = do { cwd <- System.Directory.getCurrentDirectory; return (":set prompt \"" ++ cwd ++ fill ++ " \""); }
:def doprompt (\_ -> cur ">")
:def mycd (\dir -> System.Directory.setCurrentDirectory dir >> cur ">")
:doprompt
Также, если я переименую файл ghci.conf
в произвольное имя, а затем запущу ghci.exe
, он загрузит эти модули:
Как я уже говорил, он загружает меньшее количество модулей, что означает, что с ghci.conf, ghci.exe
делает что-то успешно, но в какой-то момент терпит неудачу. Как это исправить?
System.Directory.getCurrentDirectory
Я не уверен, что это "правильный" способ сделать это, но поскольку :!
позволяет команды оболочки, вы также можете получить его с соответствующей командой оболочки (вашей ОС) для чтения каталога или содержимого (так cd
, ls
и тому подобное). Например, вы можете написать:
:! cd
Это зависит от того, для чего вам нужен каталог. Если вы просто хотите вывести его в консоль, то это может помочь.
Всего наилучшего!
Бедным решением для установки подсказки ghci в текущую рабочую директорию было бы размещение
let cur fill = do { cwd <- System.Directory.getCurrentDirectory; return (":set prompt \"" ++ cwd ++ fill ++ " \""); }
:def doprompt (\_ -> cur ">")
:def mycd (\dir -> System.Directory.setCurrentDirectory dir >> cur ">")
:doprompt
в файле .ghci
.
В первой строке мы определяем cur :: String -> IO String
, которая получает текущий каталог и возвращает команду ghci для установки подсказки соответствующим образом. Затем мы определяем ghci-команду doprompt
, которая выполняет это действие, а также команду для смены каталога и установки подсказки. Последняя строка выполняет :doprompt
при запуске.
К сожалению, это не заставляет команду :cd dir
отражать смену каталога, поэтому после этого придется вручную выполнить :doprompt
или использовать :mycd
для смены каталога.
Чтобы избежать слишком длинных запросов, можно манипулировать результатом getCurrentDirectory
, отбрасывая начальную часть пути к файлу.
Другим недостатком этого простого подхода является то, что подсказка больше не содержит информации о загруженных модулях. Я полагаю, что все это можно преодолеть, но у меня нет достаточной мотивации, чтобы копать сейчас.
В командной строке Тип г :! компакт-диск, это даст вам выход для текущего каталога. В общем, использовать
:! ` следуют команды оболочки для запуска командной оболочки в командной строке ГГц. Снаряды по-разному на Windows и Mac/Linux, поэтому команды будут разные.