diff --git a/Cargo.lock b/Cargo.lock index cbf397d..67f2326 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,18 +17,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "ahash" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "anstream" version = "0.6.4" @@ -77,18 +65,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "anyhow" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" - -[[package]] -name = "arbitrary" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" - [[package]] name = "backtrace" version = "0.3.69" @@ -125,12 +101,6 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" -[[package]] -name = "bumpalo" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - [[package]] name = "bupropion" version = "0.0.18" @@ -222,148 +192,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" -[[package]] -name = "cranelift" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4fdf311b2564edbf43d3a06335d309814f6ec60f55d090885d68e1a2e664c04" -dependencies = [ - "cranelift-codegen", - "cranelift-frontend", -] - -[[package]] -name = "cranelift-bforest" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5bb9245ec7dcc04d03110e538d31f0969d301c9d673145f4b4d5c3478539a3" -dependencies = [ - "cranelift-entity", -] - -[[package]] -name = "cranelift-codegen" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebb18d10e5ddac43ba4ca8fd4e310938569c3e484cc01b6372b27dc5bb4dfd28" -dependencies = [ - "bumpalo", - "cranelift-bforest", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-control", - "cranelift-entity", - "cranelift-isle", - "gimli", - "hashbrown 0.14.2", - "log", - "regalloc2", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-codegen-meta" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3ce6d22982c1b9b6b012654258bab1a13947bb12703518bef06b1a4867c3d6" -dependencies = [ - "cranelift-codegen-shared", -] - -[[package]] -name = "cranelift-codegen-shared" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47220fd4f9a0ce23541652b6f16f83868d282602c600d14934b2a4c166b4bd80" - -[[package]] -name = "cranelift-control" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5a4c42672aea9b6e820046b52e47a1c05d3394a6cdf4cb3c3c4b702f954bd2" -dependencies = [ - "arbitrary", -] - -[[package]] -name = "cranelift-entity" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b4e9a3296fc827f9d35135dc2c0c8dd8d8359eb1ef904bae2d55d5bcb0c9f94" - -[[package]] -name = "cranelift-frontend" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ec537d0f0b8e084517f3e7bfa1d89af343d7c7df455573fca9f272d4e01267" -dependencies = [ - "cranelift-codegen", - "log", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-isle" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45bab6d69919d210a50331d35cc6ce111567bc040aebac63a8ae130d0400a075" - -[[package]] -name = "cranelift-jit" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1daca8224e77263494e1d949daeb0a0a0992f9c489d4dc395bfc8ddda0eafcaf" -dependencies = [ - "anyhow", - "cranelift-codegen", - "cranelift-control", - "cranelift-entity", - "cranelift-module", - "cranelift-native", - "libc", - "log", - "region", - "target-lexicon", - "wasmtime-jit-icache-coherence", - "windows-sys", -] - -[[package]] -name = "cranelift-module" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533ebbad90a77980bdbbe6bd4beee9598a74db06316e8a9def7a6d9564e19f5e" -dependencies = [ - "anyhow", - "cranelift-codegen", - "cranelift-control", -] - -[[package]] -name = "cranelift-native" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f32e81605f352cf37af5463f11cd7deec7b6572741931a8d372f7fdd4a744f5d" -dependencies = [ - "cranelift-codegen", - "libc", - "target-lexicon", -] - [[package]] name = "endian-type" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - [[package]] name = "errno" version = "0.3.5" @@ -394,12 +228,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - [[package]] name = "fd-lock" version = "3.0.13" @@ -416,26 +244,6 @@ name = "gimli" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" -dependencies = [ - "fallible-iterator", - "indexmap", - "stable_deref_trait", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" [[package]] name = "heck" @@ -464,16 +272,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" -[[package]] -name = "indexmap" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" -dependencies = [ - "equivalent", - "hashbrown 0.14.2", -] - [[package]] name = "io-lifetimes" version = "1.0.11" @@ -526,15 +324,6 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" -[[package]] -name = "mach" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" -dependencies = [ - "libc", -] - [[package]] name = "memchr" version = "2.6.4" @@ -651,43 +440,12 @@ dependencies = [ "nibble_vec", ] -[[package]] -name = "regalloc2" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" -dependencies = [ - "hashbrown 0.13.2", - "log", - "rustc-hash", - "slice-group-by", - "smallvec", -] - -[[package]] -name = "region" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877e54ea2adcd70d80e9179344c97f93ef0dffd6b03e1f4529e6e83ab2fa9ae0" -dependencies = [ - "bitflags 1.3.2", - "libc", - "mach", - "winapi", -] - [[package]] name = "rustc-demangle" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustix" version = "0.37.27" @@ -756,12 +514,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "slice-group-by" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" - [[package]] name = "smallvec" version = "1.11.1" @@ -775,15 +527,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] -name = "softc" +name = "soft" version = "0.3.0" dependencies = [ "bupropion", "clap", - "cranelift", - "cranelift-jit", - "cranelift-module", - "cranelift-native", "eyre", "libc", "miette", @@ -791,12 +539,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - [[package]] name = "str-buf" version = "1.0.6" @@ -848,12 +590,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "target-lexicon" -version = "0.12.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" - [[package]] name = "terminal_size" version = "0.1.17" @@ -946,23 +682,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasmtime-jit-icache-coherence" -version = "14.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f67e6be36375c39cff57ed3b137ab691afbf2d9ba8ee1c01f77888413f218749" -dependencies = [ - "cfg-if", - "libc", - "windows-sys", -] - [[package]] name = "winapi" version = "0.3.9" @@ -1050,23 +769,3 @@ name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "zerocopy" -version = "0.7.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd369a67c0edfef15010f980c3cbe45d7f651deac2cd67ce097cd801de16557" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f140bda219a26ccc0cdb03dba58af72590c53b22642577d88a927bc5c87d6b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/Cargo.toml b/Cargo.toml index d50f480..5f522f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,16 @@ -[workspace.package] +[package] +name = "soft" edition = "2021" authors = ["Gabrielle GuimarĂ£es de Oliveira", "Sofia da Silva Rodrigues"] description = "The simpliest lisp compiler" documentation = "https://github.com/aripiprazole/soft" version = "0.3.0" -[workspace] -members = ["softc"] - -resolver = "1" +[dependencies] +bupropion = "0.0.18" +clap = {version = "4.4.7", features = ["derive"]} +eyre = "0.6.8" +libc = "0.2.149" +miette = "5.10.0" +rustyline = {version = "12.0.0", features = ["derive"]} +thiserror = "1.0.50" diff --git a/softc/Cargo.toml b/softc/Cargo.toml deleted file mode 100644 index 59e16c2..0000000 --- a/softc/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "softc" -edition.workspace = true -authors.workspace = true -documentation.workspace = true -version.workspace = true - -[dependencies] -bupropion = "0.0.18" -clap = {version = "4.4.7", features = ["derive"]} -cranelift = "0.101.4" -cranelift-jit = "0.101.4" -cranelift-module = "0.101.4" -cranelift-native = "0.101.4" -eyre = "0.6.8" -libc = "0.2.149" -miette = "5.10.0" -rustyline = {version = "12.0.0", features = ["derive"]} -thiserror = "1.0.50" diff --git a/softc/src/codegen.rs b/softc/src/codegen.rs deleted file mode 100644 index e009573..0000000 --- a/softc/src/codegen.rs +++ /dev/null @@ -1,116 +0,0 @@ -use std::collections::HashMap; - -use cranelift::prelude::*; - -use cranelift_jit::{JITModule, JITBuilder}; -use cranelift_module::{Module, FuncId, DataDescription}; -use miette::NamedSource; - -use crate::{SrcPos, semantic::SemanticError}; -use crate::semantic::Expression; - -#[derive(thiserror::Error, miette::Diagnostic, Debug)] -#[diagnostic(url(docsrs))] -#[error("soft error")] -pub struct SoftError { - #[source_code] - pub text_source: NamedSource, - - #[related] - pub related: Vec, -} - -#[derive(thiserror::Error, miette::Diagnostic, Debug, Clone)] -#[diagnostic(url(docsrs))] -pub enum InnerError { - #[error("semantic error: {0}")] - #[diagnostic(code(soft::semantic))] - SemanticError(SemanticError), -} - -#[derive(Default)] -struct VariableBuilder { - index: usize, -} - -impl VariableBuilder { - fn new() -> Self { - Self { - index: 0, - } - } - - fn create_var(&mut self, builder: &mut FunctionBuilder, value: Value) -> Variable { - let variable = Variable::new(self.index); - builder.declare_var(variable, types::I64); - self.index += 1; - builder.def_var(variable, value); - variable - } -} - -pub struct Generator { - pub builder_context: FunctionBuilderContext, - pub data_description: DataDescription, - pub location: SrcPos, - pub ctx: codegen::Context, - pub module: JITModule, - variable_builder: VariableBuilder, -} - -impl Default for Generator { - fn default() -> Self { - let mut flag_builder = settings::builder(); - - flag_builder.set("use_colocated_libcalls", "false").unwrap(); - flag_builder.set("is_pic", "false").unwrap(); - - let isa_builder = cranelift_native::builder().unwrap_or_else(|msg| { - panic!("host machine is not supported: {}", msg); - }); - - let isa = isa_builder - .finish(settings::Flags::new(flag_builder)) - .unwrap(); - - let builder = JITBuilder::with_isa(isa, cranelift_module::default_libcall_names()); - - let module = JITModule::new(builder); - - Self { - builder_context: FunctionBuilderContext::new(), - ctx: module.make_context(), - data_description: DataDescription::new(), - location: SrcPos::default(), - module, - variable_builder: Default::default(), - } - } -} - -impl Generator { - pub fn compile(&mut self) { - self.module.clear_context(&mut self.ctx); - - self.module.finalize_definitions().unwrap(); - - let code = self.module.get_finalized_function(id); - - let code = unsafe { std::mem::transmute::<_, fn() -> i64>(code) }; - - let result = code(); - - println!("{}", result); - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test() { - let mut generator = Generator::default(); - generator.compile(); - } -} \ No newline at end of file diff --git a/softc/src/ffi.rs b/softc/src/ffi.rs deleted file mode 100644 index 12ab3d9..0000000 --- a/softc/src/ffi.rs +++ /dev/null @@ -1,31 +0,0 @@ -use crate::runtime::TaggedPtr; - -#[derive(Default)] -pub struct Storage {} - -#[repr(C)] -pub struct Environment(*mut Storage); - -impl Default for Environment { - fn default() -> Self { - Self(Box::leak(Box::default()) as *mut Storage) - } -} - -impl Clone for Environment { - fn clone(&self) -> Self { - unsafe { - Self(Box::leak(Box::new(*self.0.clone()))) - } - } -} - -impl Environment { - pub fn define(&mut self, name: String, expression: TaggedPtr) {} -} - -pub mod stdlib { - use super::*; - - pub unsafe extern "C" fn plus(environment: Environment) {} -} \ No newline at end of file diff --git a/softc/src/allocator.rs b/src/allocator.rs similarity index 100% rename from softc/src/allocator.rs rename to src/allocator.rs diff --git a/softc/src/lib.rs b/src/lib.rs similarity index 99% rename from softc/src/lib.rs rename to src/lib.rs index 4417d07..d949685 100644 --- a/softc/src/lib.rs +++ b/src/lib.rs @@ -3,9 +3,7 @@ use std::fmt::Display; pub mod semantic; pub mod runtime; pub mod allocator; -pub mod codegen; pub mod parser; -pub mod ffi; /// Term is a recursive data structure that represents a list of terms, an atom, an identifier, /// or an integer. diff --git a/softc/src/main.rs b/src/main.rs similarity index 100% rename from softc/src/main.rs rename to src/main.rs diff --git a/softc/src/parser.rs b/src/parser.rs similarity index 100% rename from softc/src/parser.rs rename to src/parser.rs diff --git a/softc/src/repl.rs b/src/repl.rs similarity index 100% rename from softc/src/repl.rs rename to src/repl.rs diff --git a/softc/src/runtime.rs b/src/runtime.rs similarity index 100% rename from softc/src/runtime.rs rename to src/runtime.rs diff --git a/softc/src/semantic.rs b/src/semantic.rs similarity index 89% rename from softc/src/semantic.rs rename to src/semantic.rs index d3ce8a6..6bf0d41 100644 --- a/softc/src/semantic.rs +++ b/src/semantic.rs @@ -4,15 +4,15 @@ define_ast!(Expression, { Fun, // (fun (a b) (+ a b)) List, // (a b c) or (list a b c) Appl, // (a b c) or (apply a b c) - Define, // (define a 123) - MacroDefine, // (macro-define a (fun (a b) (+ a b)) + Def, // (define a 123) + DefMacro, // (macro-define a (fun (a b) (+ a b)) Quote, // '(fun (a b) (+ a b)) Literal // 123 | "bla" | :bla | bla }); -define_builtin!(MacroDefine, "macro-define", 2); -define_builtin!(Define, "define", 2); -define_builtin!(Fun, "fun", 2); +define_builtin!(DefMacro, "defmacro*", 2); +define_builtin!(Def, "def*", 2); +define_builtin!(Fun, "fun*", 2); define_builtin!(Quote, "'", 2); define_builtin!(List, "list"); define_builtin!(Appl, "apply"); @@ -83,7 +83,7 @@ pub mod appl { pub mod define { pub use super::*; - impl Define { + impl Def { /// Returns the name of the definition. pub fn name(&self) -> Result { self.0 @@ -106,7 +106,7 @@ pub mod define { pub mod macro_define { pub use super::*; - impl MacroDefine { + impl DefMacro { /// Returns the name of the definition. pub fn name(&self) -> Result { self.0 @@ -203,16 +203,14 @@ impl TryFrom for Expression { type Error = SemanticError; fn try_from(value: Term) -> Result { - try_new!(value, [ - Define, - MacroDefine, - Fun, - Appl, - List, - Quote, - Literal - ]) - .ok_or(SemanticError::InvalidExpression) + DefMacro::try_new(value.clone()) + .or_else(|_| Def::try_new(value.clone())) + .or_else(|_| Fun::try_new(value.clone())) + .or_else(|_| Quote::try_new(value.clone())) + .or_else(|_| Appl::try_new(value.clone())) + .or_else(|_| List::try_new(value.clone())) + .or_else(|_| Literal::try_new(value.clone()))? + .ok_or(SemanticError::InvalidExpression) } } @@ -220,20 +218,6 @@ pub trait ExpressionKind: Sized { fn try_new(term: Term) -> Result>; } -/// Pipes try new functions to each other, it's useful to create a try_from function for enums -/// that have multiple variants. -macro_rules! try_new { - ($target:expr, [$($value:ident),+]) => {{ - use crate::semantic::ExpressionKind; - let mut value = None; - $(value = match value { - Some(value) => Some(value), - None => $value::try_new($target.clone())?, - };)+ - value - }}; -} - macro_rules! define_builtin { ($name:ident, $keyword:expr, $length:expr) => { impl $crate::semantic::ExpressionKind for $name { @@ -305,4 +289,3 @@ macro_rules! define_ast { use define_ast; use define_builtin; -use try_new;