[Haskell] Как читать облитературенные исходники?
От: Andir Россия
Дата: 27.04.07 10:10
Оценка:
Привет, RSDN!

В очередной раз вернулся к Хаскелю и подумалось, что возможно я немного неправильно подхожу к вопросу чтения исходников *.lhs
Есть какой-то приемлемый способ чтения таких исходников, кроме как прямого варианта открытия в редакторе и попыток отделить код от описания мысленным усилием? (Специализированные редакторы ака vim, emacs отпадают — не использую.)
Идеальный вариант был-бы преобразовать на лету в нормальный *.hs с помещением текста в комментарии. Можно такое?

C Уважением, Andir!
using( RSDN@Home 1.2.0 alpha rev. 652 ) { /* Работаем */ }
Re: [Haskell] Как читать облитературенные исходники?
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 27.04.07 10:46
Оценка:
Здравствуйте, Andir, Вы писали:

A>В очередной раз вернулся к Хаскелю и подумалось, что возможно я немного неправильно подхожу к вопросу чтения исходников *.lhs :-)

A>Есть какой-то приемлемый способ чтения таких исходников, кроме как прямого варианта открытия в редакторе и попыток отделить код от описания мысленным усилием? (Специализированные редакторы ака vim, emacs отпадают — не использую.)
A>Идеальный вариант был-бы преобразовать на лету в нормальный *.hs с помещением текста в комментарии. Можно такое?

В поставке Hugs даже была, кажется, такая программа в демках. В GHC есть утилита unlit.
Можно схему написать для колорера и смотреть в FAR'е.
Re[2]: [Haskell] Как читать облитературенные исходники?
От: Andir Россия
Дата: 27.04.07 11:05
Оценка:
Здравствуйте, lomeo, Вы писали:

A>>Идеальный вариант был-бы преобразовать на лету в нормальный *.hs с помещением текста в комментарии. Можно такое?

L>В поставке Hugs даже была, кажется, такая программа в демках. В GHC есть утилита unlit.
L>Можно схему написать для колорера и смотреть в FAR'е.

unlit я видел — ужас годится только для препроцессирования перед компилятором. На Hugs завтречком гляну, спасбо за наводку.
Схема для колорера — неудобно, хотя и возможно — но опять же писать, когда есть готовая схема для hs.
Хочу lhs2hs! Да-да понимаю, что придётся самому, а так хочется верить в готовое (В гугле есть упоминания о такой утилитке, но версия там какая-то совсем сыроватая и предназначена для Huddock)

С Уважением, Andir!
using( RSDN@Home 1.2.0 alpha rev. 652 ) { /* Работаем */ }
Re[3]: [Haskell] Как читать облитературенные исходники?
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 27.04.07 13:33
Оценка:
Здравствуйте, Andir, Вы писали:

A>Схема для колорера — неудобно, хотя и возможно — но опять же писать, когда есть готовая схема для hs.


Схема для hs у меня есть.

A>Хочу lhs2hs! Да-да понимаю, что придётся самому, а так хочется верить в готовое :-)


Да там писать то всего ничего:

data Line = Empty | Comment String | Code String

lhsToLine ""           = Empty
lhsToLine ('>':' ':xs) = Code xs
lhsToLine xs           = Comment xs

lineToHs Empty        = ""
lineToHs (Code xs)    = xs
lineToHs (Comment xs) = '-':'-':' ':xs

main = getContents >>= mapM_ (putStrLn . lineToHs . lhsToLine) . lines


Работает с stdin/stdout, разумеется.
Re[4]: [Haskell] Как читать облитературенные исходники?
От: palm mute  
Дата: 27.04.07 14:02
Оценка: +1
Здравствуйте, 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] Как читать облитературенные исходники?
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 27.04.07 14:40
Оценка:
Здравствуйте, palm mute, Вы писали:

PM>Так не будет понимать стиль latex (\begin{code}, \end{code}).


Хм, даже не подумал про latex. Совсем из головы вылетело.

Здесь, кстати, тоже не без недостатков — приходится мешать комменты (%%Haddock) с latex текстом :-/ Из задания я понял, что надо текст преобразовать в комменты.

PM>Сам себя обрабатывает нормально. Наверно, правильнее было бы взять GHC API, но возможно, и так сойдет.


Между прочим с этим lhs не всё в порядке, то что понимает GHC ломается в Hugs, то что понимает Hugs может сломаться в GHC, а ведь есть и другие компиляторы :-(
Re[3]: [Haskell] Как читать облитературенные исходники?
От: thesz Россия http://thesz.livejournal.com
Дата: 29.04.07 15:20
Оценка:
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)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.