pokud chcete videt dobre udelane "bloky odsazovanim", kouknete se na haskell
odsazeni o libovolny pocet mezer funguje, pokud vsechny radky v bloku "zarezavaji" volitelne pouziti {, } a ; aby napr. jednoduche event-handlery neprznily flow.
oproti nedomyslenemu pythonovskemu fasismu opravdu skvele (ano, existuje "standart", a ano, dodrzuju ho. Jednim z duvodu je i to ze nemusim ...)
> Jako priklad ztrucnosti se mrknete jak je mozne realizovat vzdalene volaniv pythonu pomoci SOAPpy v.s. jak je nutne to delat v Jave
jako priklad strucnosti doporucuji mrknou jak se daji psat parsery v Parsec-u ;-)) Ma neco takovyho python ?
plne funkcni parser & writer CSV (oklesteny o komentare, zbytecne definice typu):
module Text.CSV where
import Text.ParserCombinators.Parsec
import Data.List (intersperse)
type CSV = [Record]
type Record = [Field]
type Field = String
csv = do x <- record `sependby` many1 (oneof "\n\r") eof return x <|> field) `sepBy` char ','
field = many (noneOf ",\n\r\"")
quotedField = between (char '"') (char '"') $ many (noneOf "\"" <|> try (string "\"\"" >> return '"'))
parseCSV = parse csv
parseCSVFromFile = parseFromFile csv
printCSV records = unlines (printRecord `map` records)
where printRecord = concat . intersperse "," . map printField
printField f = "\"" ++ concatMap escape f ++ "\""
escape '"' = "\"\""
escape x = [x]
jeste jednou :
module Text.CSV where
import Text.ParserCombinators.Parsec
import Data.List (intersperse)
csv = do x <- record `sepEndBy` many1 (oneOf "\n\r")
eof
return x
record = (quotedField <|> field) `sepBy` char ','
field = many (noneOf ",\n\r\"")
quotedField = between (char '"') (char '"') $ many (noneOf "\"" <|> try (string "\"\"" >> return '"'))
parseCSV = parse csv
parseCSVFromFile = parseFromFile csv
parseCSVTest = parseTest csv
printCSV records = unlines (printRecord `map` records)
where printRecord = concat . intersperse "," . map printField
printField f = "\"" ++ concatMap escape f ++ "\""
escape '"' = "\"\""
escape x = [x]