LINUX.ORG.RU

История изменений

Исправление 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

в принципе ничего тут нет не понятного, за исключением что без понимания что за типы используются, понять зачем этот код ну хз