В очередной раз вернулся к Хаскелю и подумалось, что возможно я немного неправильно подхожу к вопросу чтения исходников *.lhs
Есть какой-то приемлемый способ чтения таких исходников, кроме как прямого варианта открытия в редакторе и попыток отделить код от описания мысленным усилием? (Специализированные редакторы ака vim, emacs отпадают — не использую.)
Идеальный вариант был-бы преобразовать на лету в нормальный *.hs с помещением текста в комментарии. Можно такое?
Здравствуйте, Andir, Вы писали:
A>В очередной раз вернулся к Хаскелю и подумалось, что возможно я немного неправильно подхожу к вопросу чтения исходников *.lhs :-) A>Есть какой-то приемлемый способ чтения таких исходников, кроме как прямого варианта открытия в редакторе и попыток отделить код от описания мысленным усилием? (Специализированные редакторы ака vim, emacs отпадают — не использую.) A>Идеальный вариант был-бы преобразовать на лету в нормальный *.hs с помещением текста в комментарии. Можно такое?
В поставке Hugs даже была, кажется, такая программа в демках. В GHC есть утилита unlit.
Можно схему написать для колорера и смотреть в FAR'е.
Re[2]: [Haskell] Как читать облитературенные исходники?
Здравствуйте, lomeo, Вы писали:
A>>Идеальный вариант был-бы преобразовать на лету в нормальный *.hs с помещением текста в комментарии. Можно такое? L>В поставке Hugs даже была, кажется, такая программа в демках. В GHC есть утилита unlit. L>Можно схему написать для колорера и смотреть в FAR'е.
unlit я видел — ужас годится только для препроцессирования перед компилятором. На Hugs завтречком гляну, спасбо за наводку.
Схема для колорера — неудобно, хотя и возможно — но опять же писать, когда есть готовая схема для hs.
Хочу lhs2hs! Да-да понимаю, что придётся самому, а так хочется верить в готовое (В гугле есть упоминания о такой утилитке, но версия там какая-то совсем сыроватая и предназначена для Huddock)
Здравствуйте, lomeo, Вы писали:
A>>Хочу lhs2hs! Да-да понимаю, что придётся самому, а так хочется верить в готовое L>Да там писать то всего ничего:
Так не будет понимать стиль latex (\begin{code}, \end{code}).
Вот, по слову lhs2hs в гугле нашелся исходник, из которого можно выбросить зависимость от GetOpt, в результате получаем:
\documentclass[12pt]{report}
\usepackage{verbatim}
\begin{document}
\newenvironment{code}{\footnotesize\verbatim}{\endverbatim\normalsize}
\section*{Introduction}
This program's task is to transform a {\em literate
haskell script} \texttt{name.lhs} into a "normal" haskell script
\texttt{name.hs}.
Thereby special tex commentaries can be invoked.
This can be extremely useful when
you run e.g. documentation tools like Haddock."
\section*{Invocation of Haddock}
Annotations in Tex have to start with \verb|%%Haddock:|.
Call \texttt{lhs2hs} with the option \texttt{-h}.
\section*{Implementation}
%%Haddock:Module : Main
%%Haddock:Copyright : (c) Steffen Mazanek 2003
%%Haddock:License : Go get it :-)
%%Haddock:
%%Haddock:Maintainer : steffen.mazanek@unibw-muenchen.de
%%Haddock:Stability : don't ask *g*
%%Haddock:Portability : only with notebooks :-/
%%Haddock:
%%Haddock:This module provides a program which transforms
%%Haddock:literate Haskell scripts into /normal/ Haskell scripts.
%%Haddock:Cool, documenting projects is fun using lhs2hs!
\begin{code}
module Main where
import System
import Monad
import List
\end{code}
%%Haddock:This is the main function which is invoked automatically whenever the executable is started.
%%Haddock:It reads the command line arguments and extracts several options and the files to transform.
\begin{code}
main::IO ()
main = do args <- getArgs
run [Flag_Haddock] args
\end{code}
%%Haddock:The Flag data type is somewhat puristic but may evolve in the future.
%%Haddock:It looks a bit complicated at first but eases extensibility.
\begin{code}
data Flag = Flag_Haddock deriving (Show, Eq)
\end{code}
%%Haddock:"run" works out all the files step by step. Thereby the flags are checked
%%Haddock:and complying actions take place.
\begin{code}
run flags [] = putStrLn "Ready!"
run flags (a:args) =
do
when (not $ endsWith ".lhs" a)
(putStrLn "You should invoke .lhs-files!")
when (Flag_Haddock `elem` flags) $ do
putStrLn $ "Performing Haddock-Transformation on " ++ a
c<-readFile a
writeFile (takeWhile (/='.') a ++ ".hs") (perform haddock c)
run flags args
\end{code}
%%Haddock:As the name says "endsWith" is the counterpart of "startsWith".
\begin{code}
endsWith x = elem x . tails
perform f = unlines.f.lines
\end{code}
Here something extremely stupid has happened. The inline \verb|\end{code}|
was ambiguous and rose a latex error. So we have added a senseless character (\verb|:|).
%%Haddock:The transformation (and hence most of the complexity) are hidden by this function.
%%Haddock:It gets the lines of a particular file and performs e.g. some filter operations.
\begin{code}
haddock::[String]->[String]
haddock [] = []
haddock a@(x:xs)
| x == "\\begin{code}" = let (p1,p2) = splitCond (== '\\':"end{code}") xs in
p1 ++ haddock (tail p2)
| x == [] = []:haddock xs
| head x == '>' = tail x:haddock xs
--tex code
| startsWith "%%Haddock:" x =
let (p1,p2) = splitCond (not.startsWith "%%Haddock:") a in
"{-|":map (tail.dropWhile (/=':')) p1 ++ "-}":haddock p2
| otherwise = haddock xs
\end{code}
%%Haddock:Somewhat standard but not to find in the libraries. Checks whether a particular
%%Haddock:String starts with a certain String or not.
%Dies ist ein normaler Latex-Kommentar
\begin{code}
startsWith [] _ = True
startsWith _ [] = False
startsWith (x:xs) (y:ys) = x == y && startsWith xs ys
\end{code}
\begin{code}
splitCond::(a->Bool)->[a]->([a],[a])
splitCond p [] = ([],[])
splitCond p (x:xs)
| p x = ([], x:xs)
| otherwise = let (p1,p2) = splitCond p xs in (x:p1,p2)
usage = "lhs2hs file"
\end{code}
\end{document}
Сам себя обрабатывает нормально. Наверно, правильнее было бы взять GHC API, но возможно, и так сойдет.
Re[5]: [Haskell] Как читать облитературенные исходники?
Здравствуйте, palm mute, Вы писали:
PM>Так не будет понимать стиль latex (\begin{code}, \end{code}).
Хм, даже не подумал про latex. Совсем из головы вылетело.
Здесь, кстати, тоже не без недостатков — приходится мешать комменты (%%Haddock) с latex текстом :-/ Из задания я понял, что надо текст преобразовать в комменты.
PM>Сам себя обрабатывает нормально. Наверно, правильнее было бы взять GHC API, но возможно, и так сойдет.
Между прочим с этим lhs не всё в порядке, то что понимает GHC ломается в Hugs, то что понимает Hugs может сломаться в GHC, а ведь есть и другие компиляторы :-(
Re[3]: [Haskell] Как читать облитературенные исходники?
A>>>Идеальный вариант был-бы преобразовать на лету в нормальный *.hs с помещением текста в комментарии. Можно такое? L>>В поставке Hugs даже была, кажется, такая программа в демках. В GHC есть утилита unlit. L>>Можно схему написать для колорера и смотреть в FAR'е.
A>unlit я видел — ужас годится только для препроцессирования перед компилятором. На Hugs завтречком гляну, спасбо за наводку. A>Схема для колорера — неудобно, хотя и возможно — но опять же писать, когда есть готовая схема для hs. A>Хочу lhs2hs! Да-да понимаю, что придётся самому, а так хочется верить в готовое (В гугле есть упоминания о такой утилитке, но версия там какая-то совсем сыроватая и предназначена для Huddock)
lhs2tex
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)