www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

vorherige Seite 1 2  

Siracusa

Gepostet:
07.06.2009 21:07

   
> if isInclude s -- kann ich 'isInclude' mit "#include" ersetzen ??
Einfach durch s == "#include" ersetzen wird nicht reichen, weil deine Zeile ja irgendwie so aussieht: "#include andere_datei.k". Du könntest dort Data.List.isPrefixOf benutzen, das deckt dann aber nicht unterschiedliche Groß-/Kleinschreibung ab (falls das wichtig sein sollte).


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
newuser0815

Gepostet:
09.06.2009 20:21

Brauche wieder Hilfe  
Hallo, habe ein wenig herum Probiert aber komme jetzt nicht weiter:
Auf der Webseite :http://www.crsr.net/Programming_Languages/SoftwareTools/ch3.html , ist genau das was ich suche.
Mit ein paar Änderungen habe ich mir folgendes gebastelt :
module Inc where

import System.IO


includin kk = do
h <- pre kk
finclude h
putStr "Fertig"

pre fn = mustopen fn ReadMode

cat [] = return ()
cat (f:fs) = do
includin f
cat fs

-- finclude :: Handle -> IO ()
finclude :: Handle -> IO ()
finclude h =
do
text <- hGetContents h

mapM_ doLine $ lines text

where
-- doLine :: String -> IO ()
doLine lin = if first == "#include"
then do
h' <- mustopen (dequote second) ReadMode
finclude h'
hClose h'
else do
appendFile "todo.txt" (lin ++ "\n")
putStrLn lin
where
(first, second) = twoWords $ words lin

dequote :: String -> String
dequote ('"':s) | (last s) == '"' = init s
dequote s = s

-- mustopen :: String -> IOMode -> IO Handle
mustopen :: [Char] -> IOMode -> IO Handle
mustopen fn mode = openFile fn mode `catch` printError
where
printError = error $ fn ++ ": cannot open file"

close :: Handle -> IO ()
close = hClose

--twoWords :: [String] -> (String, String)
twoWords :: [[Char]] -> ([Char], [Char])
twoWords (a:b:_) = (a,b)
twoWords _ = ("","");

und mit dem Programm :q.hs
module Main where

import System

import Inc

main = do
args <- getArgs


cat args
wird mein Inc Modul aufgerufen.
Soweit so gut ;Nun habe ich zwei Fragen : Wo füge ich sinnvollerweise :
IF (doesFileExist "todo.txt") then removeFile "todo.txt" else Nixtun.
Dies funkzt nicht da verschieden Bool /IO Bool Typen (??)
Aber ich wollte die temporäre Datei erst löschen und dann neu schreiben.

UND ich komme mit dem Main.hs von kaos nicht zu recht.Im main-modul weren mit argv <- getArgs die Eingabeparameter abgefragt
Wo ist der beste Punkt in das Inc modul zu wechseln? Theoretisch ist mir es klar! es muß nur noch der DateiName als [Char] her aber wo??
Herzlichen Dank newuser0815
Zum Seitenanfang    
 
Siracusa

Gepostet:
10.06.2009 03:28

   
Hi!

> Wo füge ich sinnvollerweise : IF (doesFileExist "todo.txt") then removeFile "todo.txt" else Nixtun.
Kommt drauf an, ob du die Datei vor und/oder nach dem Verarbeiten löschen willst. Möglich wäre in der cat-Funktion:

cat fs = do
-- remove todo file here ...
cat' fs
where
cat' [] = return ()
cat' (f:fs) = do
includin f
cat' fs

Das danach Löschen müsste dann nach dem Lesen der todo-Datei geschehen, also im kaos-Modul. Cooler wäre natürlich, wenn die cat-Funktion direkt den Inhalt der temporären Datei zurückgibt, dann könntest du dir das Löschen komplett sparen.

> Dies funkzt nicht da verschieden Bool /IO Bool Typen (??)
Wo bekommst du hier ein Bool her? removeFile "..." ist vom Typ IO (), also muss der else-Zweig auch von diesem Typ sein. Und nichts tun wäre in dem Fall ein return (). Es gibt auch die Funktion when, das ist praktisch ein if ohne else-Zweig (für Monaden).

> Wo ist der beste Punkt in das Inc modul zu wechseln? Theoretisch ist mir es klar!
> es muß nur noch der DateiName als [Char] her aber wo??
Du musst dir aus den Parametern vom kaos-Modul die Eingabedatei heraussuchen und den String dann an die cat-Funktion übergeben. Irgendwo muss das Raussuchen im kaos-Modul schon implementiert sein, weil ja dort schon die Datei gelesen wird. Da steht dann vermutlich irgendwo sowas wie
  content <- getContents kaosFile
und du müsstest deine cat-Funktion dort einfügen:
  cat [kaosFile]
  content <- getContents "todo.txt"

So oder so ähnlich, hab dein Code jetzt nicht so auf die Schnelle komplett überschaut. ;-)


Viele Grüße,

Siracusa
Zum Seitenanfang    
 

vorherige Seite 1 2