Module Ecaml.Funcall

A typeful interface for calling Elisp, as external does for C. E.g.,

module F = struct

  let not : bool -> bool = Q.not <: bool @-> return bool

  let about_emacs : unit -> unit = Q.about_emacs <: nullary @-> return nil

end

let non f = Fn.compose F.not f

let about_emacs = F.about_emacs

The F convention is borrowed from the Emacs C source.

type 'a t
val return : 'a Ecaml__.Import.Value.Type.t -> 'a t
val nil : unit Ecaml__.Import.Value.Type.t
val nullary : unit Ecaml__.Import.Value.Type.t
val (<:) : Symbol.t -> 'a t -> 'a

Q.foo <: ... types an Elisp function, like how foo :> t types an OCaml value.

val (@->) : 'a Ecaml__.Import.Value.Type.t -> 'b t -> ('a -> 'b) t
include Ecaml__.Import.Value.Type.S
type value
type 'a t
val create : Core_kernel.Sexp.t -> ('a -> Core_kernel.Sexp.t) -> (value -> 'a) -> ('a -> value) -> 'a t
val with_of_value_exn : 'a t -> (value -> 'a) -> 'a t
val to_sexp : 'a t -> 'a -> Core_kernel.Sexp.t
val bool : bool t
val float : float t
val ignored : unit t
val int : int t
val string : string t
val string_cached : string t

string_cached is like string, except it uses of_utf8_bytes_cached.

val unit : unit t
val value : value t
val list : 'a t -> 'a list t
val vector : 'a t -> 'a array t
val option : ?⁠wrapped:bool -> 'a t -> 'a option t

The representation of an option type's values in Elisp can be "wrapped" or "unwrapped". In either case, None is represented as nil. The unrwapped representation of Some v is the representation of v, whereas the wrapped representation is cons v nil. Wrapping is necessary if nil is a representation of some value v_nil, in order to distinguish between the representation of None and Some v_nil.

val alist : 'a t -> 'b t -> ('a * 'b) list t
val tuple : 'a t -> 'b t -> ('a * 'b) t

Represent a tuple (a,b) as the elisp cons cell (a . b)

val tuple2_as_list : 'a t -> 'b t -> ('a * 'b) t

Represent a tuple (a,b) as the elisp list '(a b)

val sexpable : (module Core_kernel.Sexpable with type t = 'a) -> name:Core_kernel.Sexp.t -> 'a t

Embed a sexpable ocaml type, so we can save values of the type in emacs, e.g. as buffer local variables

val caml_embed : 'a Core_kernel.Type_equal.Id.t -> 'a t

Embed values of type 'a. Note that unlike other functions above, the values are not transformed, so this can be used to preserve state in emacs. More precisely, this following returns true:

let var = Var.create (Value.Type.caml_embed type_id) in
Current_buffer.set_value var v;
phys_equal v (Current_buffer.value_exn var)
val path_list : string list t

A list of directories. Each element is a string (directory name) or nil (try default directory). nil values are converted to ".", which has the same meaning.

module Private : sig ... end