Опубликован: 19.09.2008 | Доступ: свободный | Студентов: 656 / 70 | Оценка: 4.50 / 5.00 | Длительность: 21:25:00
Лекция 24:

Системные функции

< Лекция 23 || Лекция 24 || Лекция 25 >
Аннотация: Haskell имеет свою библиотеку, которая помогает Haskell'ю взаимодействовать с операционной системой. Библиотека называется System, имеено ее мы и рассмотрим в данной лекции

module System ( 
    ExitCode(ExitSuccess,ExitFailure),
    getArgs, getProgName, getEnv, system, exitWith, exitFailure
  ) where

data ExitCode = ExitSuccess | ExitFailure Int 
                deriving (Eq, Ord, Read, Show)

getArgs  :: IO [String]
getProgName  :: IO String
getEnv         :: String -> IO String
system         :: String -> IO ExitCode
exitWith    :: ExitCode -> IO a
exitFailure :: IO a

Эта библиотека описывает взаимодействие программы с операционной системой.

Любая операция из System может вызвать isIllegalOperation, как описано в разделе "21.1" ; все остальные допустимые ошибки описаны ниже. Обратите внимание, в частности, на то, что если реализация не поддерживает операцию, она должна вызвать isIllegalOperation.

Тип ExitCode задает коды завершения, которые программа может вернуть. ExitSuccess указывает на успешное завершение, а ExitFailure код указывает на неуспешное завершение программы со значением код. Точная интерпретация кода зависит от операционной системы. В частности, некоторые значения кода могут быть запрещены (например, 0 в POSIX-системах).

Функция getArgs возвращает список аргументов командной строки (исключая имя программы). Функция getProgName возвращает имя программы, посредством которого она была вызвана. Функция getEnv var возвращает значение переменной среды var. Если переменная var не определена, будет вызвано исключение isDoesNotExistError. Функция system cmd возвращает код завершения, сгенерированный операционной системой в результате обработки команды cmd.

Функция exitWith код завершает программу, возвращая код процессу, вызвавшему программу. Перед завершением программы сначала будут закрыты все открытые или полузакрытые дескрипторы. Вызвавший процесс может интерпретировать код возврата как пожелает, но программа должна возвратить ExitSuccess для обозначения нормального завершения и ExitFailure n для обозначения ситуации, когда программа столкнулась с проблемой, из-за которой она не может восстановиться. Значение exitFailure равно exitWith (ExitFailure exitfail), где exitfail зависит от реализации. exitWith игнорирует обработку ошибок в монаде ввода - вывода и не может быть перехвачена с помощью catch.

Если программа завершается в результате вызова функции error или потому что установлено, что ее значением является \perp, тогда она обрабатывается так же, как и функция exitFailure. Иначе, если какая-нибудь программа p завершается без явного вызова exitWith, то она обрабатывается так же, как и выражение

(p >> exitWith ExitSuccess) `catch` \ _ -> exitFailure
< Лекция 23 || Лекция 24 || Лекция 25 >
Николай Щербаков
Николай Щербаков
Россия, Москва
Олег Корсак
Олег Корсак
Латвия, Рига