История изменений
Исправление chemistmail, (текущая версия) :
sptCreateStaticBinds :: HscEnv -> Module -> CoreProgram -> IO ([SptEntry], CoreProgram)
Сигнатура функции (зачастую можно не объявлять, но это считается плохим тоном, да и не удобно) Если не понимаешь что такое карирование, то можешь считать что это функция принимает на вход 3 переменные, дальше делает какие-то вычисления с вводом выводом и возвращает тьюпл из списка SptEntry и CoreProgram
sptCreateStaticBinds hsc_env this_mod binds (тут типа запуск)
| not (xopt LangExt.StaticPointers dflags) = и сразу guard (условие выполнения ветки)
return ([], binds)
если не (чет там от LangExt.StaticPointers и dflags) возвращаем тьюпл из пустого списка и CoreProgram (dflags ниже раскрыт)
| otherwise = do
во всех остальных случаях:
_ <- lookupGlobal hsc_env unpackCStringName
делаем какойто ввод вывод, возвращаемый результат не важен
(fps, binds') <- evalStateT (go [] [] binds) 0
в рамках монадного трансформера выполняем код функции go c начальным состоянием 0, в результате получаем тьюпл из списка SptEntry и CoreProgram (тут опять же какойто ввод вывод)
return (fps, binds')
возврат из функции, возвращаем тьюпл (тип в аннотации был уже)
where дополнительно объявляем локальные функции
go fps bs xs = case xs of
тут выбор по условию
[] -> return (reverse fps, reverse bs)
bnd : xs' -> do
(fps', bnd') <- replaceStaticBind bnd
go (reverse fps' ++ fps) (bnd' : bs) XS'
по сути тут разворот списка, но при этом дергается replaceStaticBind и там есть ввод вывод
dflags = hsc_dflags hsc_env
определяем dflags как результат hsc_dflags от hsc_env
в принципе ничего тут нет не понятного, за исключением что без понимания что за типы используются, понять зачем этот код ну хз
Исходная версия chemistmail, :
Последние лет 5 не притрагивался, ну не суть.
sptCreateStaticBinds :: HscEnv -> Module -> CoreProgram -> IO ([SptEntry], CoreProgram)
Сигнатура функции (зачастую можно не объявлять, но это считается плохим тоном, да и не удобно) Если не понимаешь что такое карирование, то можешь считать что это функция принимает на вход 3 переменные, дальше делает какие-то вычисления с вводом выводом и возвращает тьюпл из списка SptEntry и CoreProgram
sptCreateStaticBinds hsc_env this_mod binds (тут типа запуск)
| not (xopt LangExt.StaticPointers dflags) = и сразу guard (условие выполнения ветки)
return ([], binds)
если не (чет там от LangExt.StaticPointers и dflags) возвращаем тьюпл из пустого списка и CoreProgram (dflags ниже раскрыт)
| otherwise = do
во всех остальных случаях: _ <- lookupGlobal hsc_env unpackCStringName делаем какойто ввод вывод, возвращаемый результат не важен (fps, binds’) <- evalStateT (go [] [] binds) 0 в рамках монадного трансформера выполняем код функции go c начальным состоянием 0, в результате получаем тьюпл из списка SptEntry и CoreProgram (тут опять же какойто ввод вывод) return (fps, binds’) возврат из функции, возвращаем тьюпл (тип в аннотации был уже) where дополнительно объявляем локальные функции go fps bs xs = case xs of тут выбор по условию [] -> return (reverse fps, reverse bs) bnd : xs’ -> do (fps’, bnd’) <- replaceStaticBind bnd go (reverse fps’ ++ fps) (bnd’ : bs) XS’ по сути тут разворот списка, но при этом дергается replaceStaticBind и там есть ввод вывод
dflags = hsc_dflags hsc_env
определяем dflags как результат hsc_dflags от hsc_env
в принципе ничего тут нет не понятного, за исключением что без понимания что за типы используются, понять зачем этот код ну хз