pub struct Value<'e> {
pub env: &'e Env,
/* private fields */
}
Expand description
A type that represents Lisp values.
Values of this type can be copied around, but are lifetime-bound to the Env
they come from.
They are also “proxy values” that are only useful when converted to Rust values, or used as arguments when calling back into the Lisp runtime.
Fields§
§env: &'e Env
Implementations§
source§impl<'e> Value<'e>
impl<'e> Value<'e>
pub fn is_not_nil(&self) -> bool
pub fn eq(&self, other: Value<'e>) -> bool
sourcepub fn into_rust<T: FromLisp<'e>>(self) -> Result<T>
pub fn into_rust<T: FromLisp<'e>>(self) -> Result<T>
Converts this value into a Rust value of the given type.
pub fn into_ref<T: 'static>(self) -> Result<Ref<'e, T>>
pub fn into_ref_mut<T: 'static>(self) -> Result<RefMut<'e, T>>
sourcepub unsafe fn get_mut<T: Transfer>(&mut self) -> Result<&mut T>
pub unsafe fn get_mut<T: Transfer>(&mut self) -> Result<&mut T>
Returns a mutable reference to the underlying Rust data wrapped by this value.
§Safety
There are several ways this can go wrong:
- Lisp code can pass the same object through 2 different values in an argument list.
- Rust code earlier in the call chain may have copied this value.
- Rust code later in the call chain may receive a copy of this value.
In general, it is better to wrap Rust data in RefCell
, Mutex
, or RwLock
guards, before
moving them to Lisp, and then only access them through these guards (which can be obtained
back through into_rust
). This method is for squeezing out the last bit of performance in
very rare situations.
pub fn car<T: FromLisp<'e>>(self) -> Result<T>
pub fn cdr<T: FromLisp<'e>>(self) -> Result<T>
source§impl<'e> Value<'e>
impl<'e> Value<'e>
sourcepub fn copy_string_contents(self, buffer: &mut [u8]) -> Result<&[u8]>
pub fn copy_string_contents(self, buffer: &mut [u8]) -> Result<&[u8]>
Copies the content of this Lisp string value to the given buffer as a null-terminated UTF-8 string. Returns the copied bytes, excluding the null terminator.
Signals an args-out-of-range
error if the buffer is too small.
source§impl<'e> Value<'e>
impl<'e> Value<'e>
sourcepub fn get_user_ptr(self) -> Result<*mut c_void>
pub fn get_user_ptr(self) -> Result<*mut c_void>
Returns the raw pointer wrapped in this user-ptr
object.
In general, prefer the user-ptr
supported provided by the defun
attr macro. Use this
function only for special user-ptr
types, such as newtypes wrapping opaque pointers.
sourcepub fn get_user_finalizer(self) -> Result<emacs_finalizer_function>
pub fn get_user_finalizer(self) -> Result<emacs_finalizer_function>
Returns the finalizer function associated with this user-ptr
object.
In general, prefer the user-ptr
supported provided by the defun
attr macro. Use this
function only for special user-ptr
types, such as newtypes wrapping opaque pointers.
source§impl<'e> Value<'e>
impl<'e> Value<'e>
sourcepub fn call<A>(self, args: A) -> Result<Value<'e>>where
A: IntoLispArgs<'e>,
pub fn call<A>(self, args: A) -> Result<Value<'e>>where
A: IntoLispArgs<'e>,
Calls this value with the given arguments. An error is signaled if it is actually not a Lisp’s callable.
args
should be an array/slice of Value
, or a tuple of different types, each implementing
IntoLisp
.
§Examples
#[defun]
fn mapc_enumerate_vec(function: Value, vector: Vector) -> Result<()> {
for (nth, elem) in vector.into_iter().enumerate() {
function.call((nth, elem))?;
}
Ok(())
}
sourcepub unsafe fn call_unprotected<A>(self, args: A) -> Result<Value<'e>>where
A: IntoLispArgs<'e>,
pub unsafe fn call_unprotected<A>(self, args: A) -> Result<Value<'e>>where
A: IntoLispArgs<'e>,
Like call
, except that the returned Value
is not protected against
Emacs GC’s bug #31238, which caused issue #2.
§Safety
This can be used as an optimization, in situations when the returned Value
is unused,
or when its usage is shorter than the lifespan of the underlying Lisp object.