packages feed

sugar-scheme-0.0.0: src/Sugar/Scheme.hs

{-# LANGUAGE OverloadedStrings #-}
module Sugar.Scheme where
  
import Sugar
import Language.Scheme.Types
import Language.Scheme.Parser
import Data.Text (unpack)
import qualified Data.Map as Map
import qualified Text.Parsec.Token as P
import Text.ParserCombinators.Parsec
import Text.Parsec.Language ()


toLispVal :: Sugar -> LispVal
toLispVal (Sugar'Unit _) = List [] -- TODO: should this be 'nil'?
toLispVal (Sugar'Text txt _) =  case parse valParser "valParser" (unpack txt) of
  Left _ -> String (unpack txt)
  Right v -> v
  where
    lexeme = P.lexeme lexer
    lexer = P.makeTokenParser lispDef
    valParser =
          try (lexeme parseComplexNumber)
      <|> try (lexeme parseRationalNumber)
      <|> try (lexeme parseRealNumber)
      <|> try (lexeme parseNumber)
      <|> try parseAtom
      <|> lexeme parseString
      <|> lexeme parseBool
      <|> parseQuoted
      <|> parseQuasiQuoted
      <|> parseUnquoted
toLispVal (Sugar'List ls _ _) = List (map toLispVal ls)
toLispVal (Sugar'Map m _) = HashTable $ Map.fromList $ map (\(x,y) -> (toLispVal x, toLispVal y)) m