Ошибка в функции печати s-expr - PullRequest
2 голосов
/ 10 марта 2011

Чтобы попрактиковаться в навыках Haskell, я следую учебному пособию «Напиши себе схему» .Я реализовал парсер для s-выражений, но у меня возникли проблемы с функцией печати. ​​

Когда я запускаю следующую программу

main :: IO ()
main  =  do args <- getArgs
            putStrLn $ readExpr (args !! 0)

, она правильно разбирает s-выражения, но когда я определяю свой собственный shows вместо deriving его, я получаю ошибочный вывод для вложенных списков и списков внутри векторов:

$ ./parser "(1 (2) 3)"
(1 (2 3))
$ ./parser "#(1 (2) 3)"
#(1 (2 3))
$ ./parser "(1 (2 (3)) 4)"
(1 (2 (3 4)))
$ ./parser "(1 (2 (3)) (4))"
(1 (2 (3 (4))))

Другие случаи и вложенные векторы работают нормально, хотя:*

lars@zygmunt:~/src/scm48$ ./parser "(1 #(2) 3)"
(1 #(2) 3)
lars@zygmunt:~/src/scm48$ ./parser "#(1 #(2) 3)"
#(1 #(2) 3)
lars@zygmunt:~/src/scm48$ ./parser "(1 (2 3))"
(1 (2 3))

Я изменил представление LispVal для включения конструкторов Nil и Pair вместо List и DottedList, поскольку они лучше соответствуют модели данных Scheme.Печать списков выполняется

showsVal :: Value -> ShowS
showsVal Nil              =  ("()" ++)
showsVal (Pair x y)       =  ("(" ++) . showsPair x y . (++ ")")
showsVal (String s)       =  shows s
showsVal (Symbol n)       =  (n ++)
showsVal (Number x)       =  shows x
showsVal (Boolean True)   =  ("#t" ++)
showsVal (Boolean False)  =  ("#f" ++)
showsVal (Vector v)       =  ("#(" ++) . showsVec v . (")" ++)

showsPair x Nil         =  showsVal x
showsPair x (Pair y z)  =  (showsVal x) . (" " ++) . showsPair y z
showsPair x y           =  (showsVal x) . (" . " ++) . (showsVal y)

showsVec []      =  id
showsVec [x]     =  shows x
showsVec (x:xs)  =  shows x . (" " ++) . showsVec xs

Я подозреваю, что ошибка в showsPair, но я просто не могу понять это.

1 Ответ

3 голосов
/ 10 марта 2011

Я узнал сам:

showsVal (Pair x y)  =  ("(" ++) . showsPair x y . (++ ")")

должно было быть

showsVal (Pair x y)  =  ("(" ++) . showsPair x y . (")" ++)
                                                --  ^^^^^^
...