emacs 0.7.0

Rust library for creating emacs modules
Documentation
# Writing Functions

You can use the attribute macro `#[defun]` to export Rust functions to the Lisp runtime, so that Lisp code can call them. These functions must have the signature `fn(..) -> Result<T>`, where `T` is any type that implements `IntoLisp`. Arguments must be of types that implement `FromLisp`.

```rust
#[defun]
fn inc(x: i64) -> Result<i64> {
    Ok(x + 1)
}

#[defun]
fn sum(x: f64, y: f64) -> Result<f64> {
    Ok(x + y)
}
```

## Naming

By default, the function's Lisp name has the form `<feature-prefix>[mod-prefix]<base-name>`.
- `feature-prefix` is the feature's name, followed by `-`. This can be customized by the `name` and `separator` [options]./module.md#options on `#[emacs::module]`.
- `mod-prefix` is constructed from the function's Rust module path (with `_` and `::` replaced by `-`). This can be turned off crate-wide, or for individual function, using the option `mod_in_name`.
- `base-name` is the function's Rust name (with `_` replaced by `-`). This can be overridden with the option `name`.

Examples:

```rust
// Assuming crate's name is `native_parallelism`.

#[emacs::module(separator = "/")]
fn init(_: &Env) -> Result<()> { Ok(()) }

mod shared_state {
    mod thread {
        // Ignore the nested mod's.
        // native-parallelism/make-thread
        #[defun(mod_in_name = false)]
        fn make_thread(name: String) -> Result<Value<'_>> {
            ..
        }
    }

    mod process {
        // native-parallelism/shared-state-process-launch
        #[defun]
        fn launch(name: String) -> Result<Value<'_>> {
            ..
        }

        // Explicitly named, since Rust identifier cannot contain `:`.
        // native-parallelism/process:pool
        #[defun(mod_in_name = false, name = "process:pool")]
        fn pool(name: String, min: i64, max: i64) -> Result<Value<'_>> {
            ..
        }
    }
}
```

## Interacting with the Lisp runtime

To interact with the Lisp runtime, e.g. calling a Lisp function, declare an additional argument of type `&Env`. This argument does not appear in the function's Lisp signature.

```rust
// Assuming crate's name is `misc`.
use std::time::SystemTime;

#[defun]
fn what_time_is_it(env: &Env) -> Result<Value<'_>> {
    env.message(format!("{:#?}", SystemTime::now()))
}
```

```emacs-lisp
;; No argument
(misc-what-time-is-it)
```