从包含其中一些的字符串中删除双反斜杠

removing double backslash from string containing some of them

我遇到了麻烦,因为我无法定义函数来执行此操作:

输入:“(case (+ 5 5) ((4 9 1) 'd64)\\n((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

我知道最后一个函数没有很好地编码看他们的参数,但我试图为 "all strings" 做一个替换函数,但我现在不能。

然后,我的解析器无法工作,原因是这样的:

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 函数,我认为代码不起作用,因为解析器与那些 \n.

不匹配

对于这个问题的早期版本中的错误解释,我们深表歉意。

需要的函数是:

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)"

现在我的解析器工作得很好