从包含其中一些的字符串中删除双反斜杠
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
新信息:
适用于 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)"
现在我的解析器工作得很好
我遇到了麻烦,因为我无法定义函数来执行此操作:
输入:“(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
新信息:
适用于 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)"
现在我的解析器工作得很好