From 907c8ce1af4b14ed0e417680cbcbd1a2ec3f75a9 Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Wed, 12 Jan 2022 18:00:11 -0800 Subject: [PATCH] Move src/syn/word.rs to src/scope.rs; add BuiltinFn * crate::scope instead of crate::syn::word, which makes more sense because scopes are not really used in syntax at all * Reference-counted BuiltinFn values are available for creation now Signed-off-by: Alek Ratzloff --- src/compile.rs | 3 ++- src/main.rs | 1 + src/object.rs | 24 +++++++++++++++++++----- src/{syn/words.rs => scope.rs} | 0 src/syn/mod.rs | 1 - src/vm/error.rs | 2 -- src/vm/inst.rs | 2 +- src/vm/machine.rs | 3 ++- 8 files changed, 25 insertions(+), 11 deletions(-) rename src/{syn/words.rs => scope.rs} (100%) diff --git a/src/compile.rs b/src/compile.rs index f6c3776..12b7e39 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -1,5 +1,6 @@ use crate::object::{QuoteTable, Value}; -use crate::syn::{ast::*, words::*}; +use crate::scope::*; +use crate::syn::ast::*; use crate::vm::inst::*; pub struct Compile<'s> { diff --git a/src/main.rs b/src/main.rs index 9990b70..172423c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ mod compile; mod object; +mod scope; mod syn; mod vm; diff --git a/src/object.rs b/src/object.rs index cec18b3..6c4dac1 100644 --- a/src/object.rs +++ b/src/object.rs @@ -4,13 +4,11 @@ #![allow(dead_code)] use crate::syn::ast::SpExpr; -use crate::{ - syn::{span::Span, words::Scope}, - vm::inst::Inst, -}; +use crate::vm::machine::Machine; +use crate::{scope::Scope, syn::span::Span, vm::inst::Inst}; use std::cell::RefCell; use std::collections::{BTreeMap, HashMap}; -use std::fmt::{self, Display}; +use std::fmt::{self, Debug, Display}; use std::rc::{Rc, Weak}; pub type Str = String; @@ -72,6 +70,7 @@ pub enum Value { Str(Str), Quote(Quote), ObjPtr(ObjPtr), + BuiltinFn(BuiltinFn), } impl Value { @@ -84,6 +83,7 @@ impl Value { Str(_) => "str", Quote(_) => "quote", ObjPtr(_) => "object", + BuiltinFn(_) => "builtin function", } } } @@ -98,10 +98,24 @@ impl Display for Value { Str(s) => write!(fmt, "{}", s), Quote(q) => write!(fmt, "[quoted value #{}]", q.index()), ObjPtr(o) => write!(fmt, "[object #{}]", o.slot()), + BuiltinFn(b) => write!(fmt, "[{:?}]", b), } } } +#[derive(Clone)] +pub struct BuiltinFn(Rc); + +impl Debug for BuiltinFn { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + write!( + fmt, + "builtin function at {:#x}", + (&self.0 as *const _ as usize) + ) + } +} + // ///////////////////////////////////////////////////////////////////////////// // Obj // ///////////////////////////////////////////////////////////////////////////// diff --git a/src/syn/words.rs b/src/scope.rs similarity index 100% rename from src/syn/words.rs rename to src/scope.rs diff --git a/src/syn/mod.rs b/src/syn/mod.rs index a4a4984..63ccd89 100644 --- a/src/syn/mod.rs +++ b/src/syn/mod.rs @@ -4,4 +4,3 @@ pub mod lexer; pub mod parser; pub mod span; pub mod token; -pub mod words; diff --git a/src/vm/error.rs b/src/vm/error.rs index 226c9e7..7eeae55 100644 --- a/src/vm/error.rs +++ b/src/vm/error.rs @@ -13,8 +13,6 @@ pub enum RuntimeError { #[error("cannot call non-quote value '{0}'")] CannotCall(String), - //#[error("stack underflow")] - //StackUnderflow, } pub type Result = std::result::Result; diff --git a/src/vm/inst.rs b/src/vm/inst.rs index 1283bba..e04e99a 100644 --- a/src/vm/inst.rs +++ b/src/vm/inst.rs @@ -1,5 +1,5 @@ use crate::object::Value; -use crate::syn::words::Word; +use crate::scope::Word; #[derive(Debug, Clone)] pub enum Inst { diff --git a/src/vm/machine.rs b/src/vm/machine.rs index 8006442..43a5a20 100644 --- a/src/vm/machine.rs +++ b/src/vm/machine.rs @@ -1,6 +1,7 @@ use crate::compile::Compile; use crate::object::*; -use crate::syn::{ast::SpExpr, words::*}; +use crate::scope::*; +use crate::syn::ast::SpExpr; use crate::vm::{error::*, inst::*}; use std::cell::RefCell; use std::collections::BTreeMap;