haskelisp-0.1.0.1: 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 <- intern fname
interactiveFormQ <- intern "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