vorherige Seite | 1 2 |
Gepostet: |
|||||||||||
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 | |||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||
Gepostet: |
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 | |||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||
Gepostet: |
|||||||||||
> 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 | |||||||||||
Gepostet: |
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 | |||||||||||
Gepostet: |
|||||||||||
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:
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 |