2015-05-09 91 views
-2

遇到麻煩,因爲我不能定義一個函數來做到這一點:除去雙反斜線

輸入:「(情況(+ 5 5)((4 9 1)' ((1 2)'pepito)\\ n((10)'jorgito)「
輸出:」(case(+5 5)((4 9 1)'d64)\ n((1 2) 'pepito)\ n((10)' jorgito)」

我已經試過這和許多其他,都沒有成功:

import Data.List.Split (splitOn) 
import Data.List (intersperse) 
import Data.Char 

replace :: String -> String -> String -> [String] 
replace current next [] = [] 
replace current next xs = intersperse [chr 92] $ splitOn current xs 

我知道最後的功能沒有得到很好的編碼尋找他們的論據, 但是我 試圖做一個「所有字符串」的替換功能,但我現在不能。

然後,我的解析器不能工作的原因是這樣的:

parseCaseResult :: Parser LispVal 
parseCaseResult = do 
    char '\'' 
    first <- (letter <|> symbol) --de momento será una String 
    rest <- many (digit <|> letter <|> symbol) 
    return $ String (first:rest) 

parseCasePair :: Parser CasePair 
parseCasePair = do 
    list <- lexeme (char '(') >> (lexeme (char '(')) *> parseList <* (lexeme $ char ')') 
    result <- lexeme $ parseCaseResult <* char ')' 
    return (list, result) 

parseCaseExpr :: Parser LispVal 
parseCaseExpr = do 
    lexeme $ char '(' 
    lexeme $ string "case" 
    conditional_expr <- lexeme (char '(') *> parseList <* lexeme (char ')') 
    -- armada en las nuevas líneas, solucionado con un parser más trabajado 
    lista <- sepBy parseCasePair newline -- $ try (string "\\\\\n") <|> try (string "\n") <|> string "\r" 
    return $ CaseExpr conditional_expr lista 

新信息:

Complete code in github.com

例,在GHCI工作:

*Main> eval $ fromRight $ parse parseExpr "jaja" "(case (+ 5 5) ((4 9 1) 'd64\n((1 2) 'pepito\n((10) 'jorgito)" 
10 (4 9 1) 
10 (1 2) 
10 (10) 
Right "jorgito" 

但是,如果我編譯並運行main函數,代碼不會工作k我認爲是因爲解析器不匹配那些\\n

對不起,在這個問題的早期版本中的不好解釋。

+0

轉義使這有點混亂。你是否正在尋找一個函數,將n轉換爲一個實際的換行符? –

+0

@DavidYoung現在它被編輯了,我認爲這更清楚。當我做'getArgs'時,那個getArgs給了我一個'\\'的'String',所以我的解析器不能解析這個,並且我的程序失敗了。 – freinn

+0

請注意,當您打印一個包含單個反斜槓的字符串時,Haskell會引用該反斜槓。你確定這個字符串實際上是否包含一個雙反斜槓,或者它可能只有一個'\ n'? 關於你的問題令人困惑的是,在Haskell語法中,第一個字符串包含一個'\ n',而第二個字符串包含一個ascii換行字符。 – lpsmith

回答

0

所需的功能是:

foo :: String -> String 
foo s = read $ "\"" ++ s ++ "\"" 

即達到我想要的,變換:

「(情況(+ 5 5)((4 9 1)「D64)\\ N(( 1 2) 'pepito)\\ N((10)' 789.456) 「

」(情況(+ 5 5)((4 9 1)「D64)\ N((1 2) '(pepito)\ n((10)'789.456)「

現在我的解析器正在像一個魅力