我遇到了麻烦,因为我无法定义一个函数来执行此操作:
输入:“(案例(+ 5 5)((4 9 1)'d64)\\ n((1 2)'pepito)\\ n((10)'jorgito)”
输出:“(案例(+ 5 5)((4 9 1)'d64)\ n((1 2)'pepito)\ n((10)'jorgito)”
我已尝试过这个以及其他许多方面,但没有成功:
base.Draw(...)
我知道最后一个函数没有很好地编码查看它们的参数,但我试图为“所有字符串”做一个替换函数,但我现在还不能。
然后,我的解析器无法工作原因是这样的:
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
新信息:
适用于GHCi的示例:
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
但是如果我编译并运行*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
不匹配。
对于此问题的早期版本中的错误解释感到抱歉。
答案 0 :(得分:2)
所需的功能是:
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)”
现在我的解析器就像魅力一样