LINUX.ORG.RU

посмотрите пожалуйста мой говнокод

 


0

1

Я на хацкеле писал только один проект в институте, а сейчас решил написать шелл с автокомплитом и скроллом хистори вверх-вниз. Есть уверенность что there is potential for improvement. Специалисты, пожалуйста покритикуйте. http://pastebin.com/C4K3J7Ka


Ответ на: комментарий от anonymous

благодарю, но это в тэги а не в ответы

nokachi
() автор топика
Ответ на: комментарий от ritsufag

хм, ну че непонятно-то? читаем следующий символ и переходим в соответствующее состояние. Больше там ничего и нету.

nokachi
() автор топика

Есть уверенность что there is potential for improvement.

в шелле у тебя тоже 3/8 haskell и 5/8 на другом языке?

false ★★★★★
()
Ответ на: комментарий от false

ну сам посмотри. Похоже что да, вроде хаскель а написано как-то низкоуровнево.

nokachi
() автор топика
Ответ на: комментарий от anonymous

спасибо! а это всегда так в хаскелевом стиле пишут — типа, убедился что функция работает и зашифровал ее до неузнаваемости? С зипом, правда, в сто раз лучше.

nokachi
() автор топика
Последнее исправление: nokachi (всего исправлений: 1)
Ответ на: комментарий от nokachi

переходим в соответствующее состояние.

ИМХО плохо, что состояния размазаны по всеему коду. Ну и комментировать надо не только случаи, которые тебе кажутся сомнительными. А так - очень даже интересно.

Кстати '\n' в этом вашем хаскеле парсится в зависимости от платформы?

ziemin ★★
()
Ответ на: комментарий от nokachi

а это всегда так в хаскелевом стиле пишут — типа, убедился что функция работает и зашифровал ее до неузнаваемости?

Это мне тоже не нравится. Что хуже всего, hlint такие вещи иногда «рекомендует». Из-за этого я его даже перестал использовать.

Но советую, тем не менее, пропустить через этот hlint. Только нужно помнить, что иногда он фигню советует.

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от nokachi

убедился что функция работает и зашифровал ее до неузнаваемости

Так только малолетние позеры пишут.

anonymous
()
Ответ на: комментарий от qnikst

Не для учебы, просто так. Ну и на работе аналогичный интерфейс для клиента есть на перле так я переписал клиентскую библиотеку на хаскеле и шелл тоже решил заменить.

nokachi
() автор топика
Ответ на: комментарий от nokachi

а почему не haskelline, readline, там много интересного уже реализовано.

rmdups == Data.List.nub

startsWith == [MissingH]Data.(String|List).Utils.startsWith

 UpSearch (b, p, f) -> do
              if null p then loop (PurePrefix (b, p, f))
                else do

я бы тут гарды использовал

qnikst ★★★★★
()

startsWith, rmdups

Data.List: isPrefixOf, nub?

shell

А вынести обработку enter / down / up / tab в отдельные ф-ии?

Честно говоря, читается не очень легко.

// вот откопал у себя пример на haskelline (оттуда используется лишь несколько низкоуровневых ф-ий для работы с историей): http://lpaste.net/91090

anonymous
()

getBuffer :: State -> String

Тоже не очень: TypeCon (..,..) вряд ли лучше TypeCon .. .., общее поле лучше выносить: type State = (Buffer, SearchState), да и всегда можно:

data D = A { common :: String, a :: Int } | B { common :: String, b :: Float }
common $ A "test" 5

anonymous
()

reverse . tail . reverse

Даже если бы не было init, это неэффективно (ну мало ли будет expand-glob, как ^X* в zsh).

anonymous
()
x = ss !! 0
b = x !! 0

Паттерматчинг

| c == '\t'
| c == '\n'

Паттерматчинг

if null buffer then ... else ...

..Паттернматчинг

data State = Newline (String, [String], [String])

В тупле тут никакого смыла, пиши сразу Newline String [String] [String]

concat $ intersperse "\n" ["modUname", "modLs", "modCat", "modTailF"]

Data.List.intercalate

А так норм, императивненько.

anonymous
()
Ответ на: комментарий от anonymous

А да, вместо

reverse . tail . reverse

пишут

drop' :: Int -> [b] -> [b]
drop' = zipWith const xs (drop n xs)

и, соответственно, reverse . tail . reverse = drop' 1

anonymous
()
Ответ на: комментарий от qnikst

Haskeline поудобней все-таки. К тому же с readline у меня были проблемы с историей, которые решились только использованием haskeline.

fmap
()
Ответ на: комментарий от nokachi

убедился что функция работает и зашифровал ее до неузнаваемости

Не всегда, но иногда. :)

fmap
()
Ответ на: комментарий от anonymous

drop' = zipWith const xs (drop n xs)

А где параметры слева? Тогда уж <fat>ap (zipWith const) . drop

anonymous
()
startsWith = isPrefixOf

тред не читал.

anonymous
()
Ответ на: комментарий от anonymous

ну лист я заменю потом на что-нибудь более подходящее

nokachi
() автор топика
Ответ на: комментарий от qnikst

Для пользователя haskelline чем лучше-то? Один «биндинг» аки map в виме - жуть.

anonymous
()
Ответ на: комментарий от unC0Rr

чорт, надо уже словарь заводить со всеми названиями :)

nokachi
() автор топика
Ответ на: комментарий от splinter

когда смотрю на haskell то меня не покидает стойкое ощущение инопланетного мессаджа.

Поэтому он так популярен среди школоты, ведь айфон последней модели им не доступен, вот и приходится выделяться среди сверстников таким нищебродским способом.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.