1{-# LANGUAGE OverloadedStrings #-}23-- | This module implement a 'Formatter' for Scheme procedure definitions.4--5-- For example:6--7-- > (define (my-proc x1 x2)8-- > (* x1 x2))9module SchemeDoc.Format.Procedure (Procedure (..), mkProcedure) where1011import qualified Data.Text as T1213import SchemeDoc.Format.Types14import SchemeDoc.Format.Util15import SchemeDoc.Types1617-- | A R7RS Scheme procedure definition.18data Procedure = Procedure19 { name :: T.Text20 -- ^ Identifier, i.e. procedure name.21 , params :: [T.Text]22 -- ^ Procedure parameters.23 , body :: [Sexp]24 -- ^ Procedure body.25 }26 deriving (Eq, Show)2728instance Formatable Procedure where29 fmt (Procedure{name = internalId, params = p}) desc =30 mkDeclaration internalId desc $ \n ->31 do32 component "procedure" n33 fromMkd desc34 htmlSexp $ List (Id n : map Id p)3536-- | Parses a Scheme procedure definition.37--38-- > <procedure> → (define (<identifier> <def formals>) <body>)39--40-- where41--42-- > <def formals> → <identifier>* | <identifier>* . <identifier>43mkProcedure :: Sexp -> Maybe Procedure44mkProcedure (List ((Id "define") : (List ((Id defid) : arglst)) : bodylst)) =45 (flip $ Procedure defid) bodylst46 <$> mapM (onId id) arglst47mkProcedure _ = Nothing