haskelisp-0.1.0.0: src/Emacs/Command.hs
{-# LANGUAGE OverloadedStrings #-}
module Emacs.Command
( setCommand'
, defcommand
) where
import Emacs.Core
import Data.Text
import Control.Monad (void)
-- 依存型とか駆使すれば多分 interacvie form と関数の引数の型の整合性が
-- 取れていることが多分保証できる。
-- これは直接は使って欲くないため、' postfix を付けている。
-- EmacsValue を引数として取っているので function 以外のものを渡せてしまう
setCommand' :: Text -> InteractiveForm -> EmacsValue -> EmacsM ()
setCommand' fname form f = do
fnameQ <- mkSymbol fname
interactiveFormQ <- mkSymbol "interactive-form"
void $ funcall2 "fset" fnameQ f
void $ funcall3 "put" fnameQ interactiveFormQ =<< evalString "'(interactive nil)"
-- TODO: interacitve-form の携帯によってarity は決まる?かな
defcommand
:: Text
-> Doc
-> InteractiveForm
-> Arity
-> ([EmacsValue] -> EmacsM EmacsValue)
-> EmacsM ()
defcommand fname (Doc doc) form (Arity arity) f =
setCommand' fname form =<< mkFunction f arity arity doc