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:
01.06.2009 23:17

   
Die Änderungen findest du hier: http://haskell.org/ghc/docs/6.10.1/html/users_guide/release-6-10-1.html#id2566405. Waren dann doch nicht so große Umarbeitungen, eher mehrere kleine. ^^ Dein Fehler mit dem Maybe ist wird vermutlich auf die Änderungen an den Container-Klassen zurückzuführen sein. Da am besten direkt in der Libraries-Doku nachschauen: http://www.haskell.org/ghc/docs/6.10.1/html/libraries/index.html


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
newuser0815

Gepostet:
02.06.2009 09:16

   
Hallo,
Wenn ich version 6.10.3 verwende, dann schreibe ich in kaos.cabal : Build-Depends: base <4 , (base-3.0.3.1 ) ;
Warum kann ich nicht container<0.2.0.0 verwenden??
Danke newuser0815
Zum Seitenanfang    
 
Siracusa

Gepostet:
02.06.2009 20:33

   
Hi nochmal,

also ich kenn mich mit der package-Verwaltung vom GHC nicht so detailliert aus, aber theoretisch sollte das gehen. Wenn du den "alten" Quellcode mit dem GHC 6.10.3 kompilieren willst, dann logischerweise auch mit den alten Packages. Bei container solltest du alte und neue Version parallel installieren können und dann die entsprechende beim Kompilieren auswählen. Ob zwei base-Packages mit dem gleichen Compiler verwendet werden können, da bin ich mir nicht sicher. Welchen Fehler bekommst du denn?

Zur Package-Verwaltung gibt's hier übrigens Doku: http://haskell.org/ghc/docs/6.10.1/html/users_guide/packages.html. Interessant vermutlich der Teil zu ghc-pkg.

Einfacher wäre allemal den GHC 6.8.3 zusätzlich zu installieren und mit dem zu kompilieren. ;-)


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
newuser0815

Gepostet:
06.06.2009 08:50

Danke , noch eine Frage  
Herzlichen Dank für die Antwort,

"Einfacher wäre allemal den GHC 6.8.3 zusätzlich zu installieren und mit dem zu kompilieren. ;-)"
Auf jeden Fall für den Moment!

Noch eine "Imperative Frage":(bezogen auf das kaos-Programm)

Es wird Zeile eingelesen und bei allen CString wird im Output-file "HALLO" erzeugt, auch bei "[1]" welches aber korrekt nur [1] lauten soll
Mein Gedanke war bei der Ausgabe in Emit.hs einfach eine Fallunterscheidung einzubauen etwa:
orginal :
emitConst (CString s) =s
mein Vorschlag
emitConst (CString s)
| (s)!!1=="[" = tag (init (s))
| otherwise = s
ODER eine if then else constuction; nur da bekomme ich Fehler wegen Vergleich Char mit [Char]
Ich glaube es liegt noch irgendwie beim "C" Denken...

Danke newuser0815
PS wäre es möglich , wenn in einem Text das Schlüsselword "#include" erscheint , dann den nachfolgenden String als eine Datei in die vorhandene einzufügen. Mit awk kein Problem(nur mit Win etwas schwerer)
for i in `awk '/#include/ { print $2 }' $1`
do
echo $i included
cat $i >>$TMP
Dies würde dann wahrscheinlich als neues Modul hinzugefügt werden müssen.
Zum Seitenanfang    
 
newuser0815

Gepostet:
06.06.2009 12:39

   
Hi,
die Antwort auf den Ersten Teil hab ich ,glaube ich selber, gefunden: (zumindest ist das Ergebnis korrekt! in 'output.cos')

emitConst (CString s) = if (s)!!1=='[' then tail (init(s)) else s

Am Zweiten (include) bin ich noch dran , Tipps willkommen.

Gruß newuser0815
Zum Seitenanfang    
 
Siracusa

Gepostet:
06.06.2009 20:26

   
Hi,

> if (s)!!1=='[' then tail (init(s)) else s
Ist denn sichergestellt, das s immer mindestens zwei Zeichen enthält? Sonst gibt's beim !!1 u.U. einen Laufzeitfehler.

> wäre es möglich , wenn in einem Text das Schlüsselword "#include" erscheint , dann den nachfolgenden String als eine Datei in die vorhandene einzufügen.
Ja, durchaus möglich. Willst du denn direkt in die Datei schreiben (als eine Art Preprocessing), oder nur den Input-String beim Parsen verändern? Im ersten Fall könnte man die Source-Datei zeilenweise durchgehen und die aktuelle Zeile in eine zweite Datei schreiben. Dabei mit Text.Regex.matchRegex immer prüfen, ob ein include vorliegt, und falls ja, die Zieldatei lesen und diese in die zweite Datei schreiben. Passende Funktionen für den Umgang mit Dateien findest du in System.IO.

Für Fall zwei einfach ein Text.Regex.subRegex auf dem Eingabestring machen. Oder direkt im Syntaxbaum ersetzen, falls das in dem Programm funktioniert.


Vielel Grüße,

Siracusa
Zum Seitenanfang    
 
newuser0815

Gepostet:
06.06.2009 20:43

   
Hallo,
>Ist denn sichergestellt, das s immer mindestens zwei Zeichen enthält? Sonst gibt's beim !!1 u.U. einen Laufzeitfehler.
Hm, richtig aber dann ist es auch in der zu kompilierenden Datei ein Fehler, da die Funktion so aus sehen muß! :
....newbutton(3, "ds gui", 14, 77, 331, 0, 0 ,"[]", 2000, 1); oder ....newbutton(3, "ds gui", 14, 77, 331, 0, 0 ,"[3]", 2000, 1);

>(als eine Art Preprocessing)
So etwas habe ich im Sinn; Preprocess(Orginaldatei) => temp , welche dann im eigentlichen Kompiler bearbeitet wird.
Habe die gefunden:http://www.haskell.org/haskellwiki/Haskell_IO_for_Imperative_Programmers unter 5

readWithIncludes :: String -> IO [String]
readWithIncludes f = do
s <- readFile f
ss <- mapM expandIncludes (lines s)
return (concat ss)

expandIncludes :: String -> IO [String]
expandIncludes s =
if isInclude s -- kann ich 'isInclude' mit "#include" ersetzen ??
then
readWithIncludes (includeFile s)
else
return [s]
Bin noch am probieren,
Gruß newuser0815
Zum Seitenanfang    
 
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