forked from Orchid/orchid
September-october commit
- manual parser - stl refinements - all language constructs are now Send
This commit is contained in:
@@ -3,13 +3,12 @@ use std::fmt::{Debug, Display};
|
||||
use std::hash::Hash;
|
||||
use std::rc::Rc;
|
||||
|
||||
use dyn_clone::DynClone;
|
||||
use dyn_clone::{DynClone, clone_box};
|
||||
|
||||
use super::XfnResult;
|
||||
use crate::interpreted::ExprInst;
|
||||
use crate::interpreter::Context;
|
||||
use crate::representations::interpreted::Clause;
|
||||
use crate::Primitive;
|
||||
|
||||
/// Errors produced by external code
|
||||
pub trait ExternError: Display {
|
||||
@@ -34,7 +33,7 @@ impl Error for dyn ExternError {}
|
||||
/// Represents an externally defined function from the perspective of
|
||||
/// the executor. Since Orchid lacks basic numerical operations,
|
||||
/// these are also external functions.
|
||||
pub trait ExternFn: DynClone {
|
||||
pub trait ExternFn: DynClone + Send {
|
||||
/// Display name of the function
|
||||
#[must_use]
|
||||
fn name(&self) -> &str;
|
||||
@@ -50,7 +49,7 @@ pub trait ExternFn: DynClone {
|
||||
where
|
||||
Self: Sized + 'static,
|
||||
{
|
||||
Clause::P(Primitive::ExternFn(Box::new(self)))
|
||||
Clause::ExternFn(ExFn(Box::new(self)))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,3 +67,21 @@ impl Debug for dyn ExternFn {
|
||||
write!(f, "##EXTERN[{}]##", self.name())
|
||||
}
|
||||
}
|
||||
|
||||
/// Represents a black box function that can be applied to a [Clause] to produce
|
||||
/// a new [Clause], typically an [Atom] representing external work, a new [ExFn]
|
||||
/// to take additional arguments, or an Orchid tree to return control to the
|
||||
/// interpreter
|
||||
#[derive(Debug)]
|
||||
pub struct ExFn(pub Box<dyn ExternFn + 'static>);
|
||||
impl ExFn {
|
||||
/// Combine the function with an argument to produce a new clause
|
||||
pub fn apply(self, arg: ExprInst, ctx: Context) -> XfnResult<Clause> {
|
||||
self.0.apply(arg, ctx)
|
||||
}
|
||||
}
|
||||
impl Clone for ExFn {
|
||||
fn clone(&self) -> Self {
|
||||
Self(clone_box(self.0.as_ref()))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user