mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-30 07:14:46 +00:00
repl: initial working version with new crate structure
This commit is contained in:
parent
0f206121bd
commit
f098c6cb99
13 changed files with 120 additions and 25 deletions
39
Cargo.lock
generated
39
Cargo.lock
generated
|
@ -3351,6 +3351,7 @@ dependencies = [
|
||||||
"roc_parse",
|
"roc_parse",
|
||||||
"roc_problem",
|
"roc_problem",
|
||||||
"roc_region",
|
"roc_region",
|
||||||
|
"roc_repl_cli",
|
||||||
"roc_reporting",
|
"roc_reporting",
|
||||||
"roc_solve",
|
"roc_solve",
|
||||||
"roc_target",
|
"roc_target",
|
||||||
|
@ -3672,6 +3673,44 @@ dependencies = [
|
||||||
"static_assertions",
|
"static_assertions",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "roc_repl_cli"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"bumpalo",
|
||||||
|
"const_format",
|
||||||
|
"roc_mono",
|
||||||
|
"roc_parse",
|
||||||
|
"roc_repl_eval",
|
||||||
|
"rustyline",
|
||||||
|
"rustyline-derive",
|
||||||
|
"target-lexicon",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "roc_repl_eval"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"bumpalo",
|
||||||
|
"inkwell 0.1.0",
|
||||||
|
"libloading 0.7.1",
|
||||||
|
"roc_build",
|
||||||
|
"roc_builtins",
|
||||||
|
"roc_can",
|
||||||
|
"roc_collections",
|
||||||
|
"roc_fmt",
|
||||||
|
"roc_gen_llvm",
|
||||||
|
"roc_load",
|
||||||
|
"roc_module",
|
||||||
|
"roc_mono",
|
||||||
|
"roc_parse",
|
||||||
|
"roc_region",
|
||||||
|
"roc_reporting",
|
||||||
|
"roc_target",
|
||||||
|
"roc_types",
|
||||||
|
"target-lexicon",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "roc_reporting"
|
name = "roc_reporting"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
|
@ -33,6 +33,8 @@ members = [
|
||||||
"code_markup",
|
"code_markup",
|
||||||
"error_macros",
|
"error_macros",
|
||||||
"reporting",
|
"reporting",
|
||||||
|
"repl_cli",
|
||||||
|
"repl_eval",
|
||||||
"roc_std",
|
"roc_std",
|
||||||
"test_utils",
|
"test_utils",
|
||||||
"utils",
|
"utils",
|
||||||
|
|
|
@ -66,6 +66,7 @@ roc_reporting = { path = "../reporting" }
|
||||||
roc_error_macros = { path = "../error_macros" }
|
roc_error_macros = { path = "../error_macros" }
|
||||||
roc_editor = { path = "../editor", optional = true }
|
roc_editor = { path = "../editor", optional = true }
|
||||||
roc_linker = { path = "../linker" }
|
roc_linker = { path = "../linker" }
|
||||||
|
roc_repl_cli = { path = "../repl_cli" }
|
||||||
clap = { version = "= 3.0.0-beta.5", default-features = false, features = ["std", "color", "suggestions"] }
|
clap = { version = "= 3.0.0-beta.5", default-features = false, features = ["std", "color", "suggestions"] }
|
||||||
const_format = "0.2.22"
|
const_format = "0.2.22"
|
||||||
rustyline = { git = "https://github.com/rtfeldman/rustyline", tag = "v9.1.1" }
|
rustyline = { git = "https://github.com/rtfeldman/rustyline", tag = "v9.1.1" }
|
||||||
|
|
|
@ -18,7 +18,6 @@ use target_lexicon::{Architecture, OperatingSystem, Triple, X86_32Architecture};
|
||||||
|
|
||||||
pub mod build;
|
pub mod build;
|
||||||
mod format;
|
mod format;
|
||||||
pub mod repl;
|
|
||||||
pub use format::format;
|
pub use format::format;
|
||||||
|
|
||||||
pub const CMD_BUILD: &str = "build";
|
pub const CMD_BUILD: &str = "build";
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
use roc_cli::build::check_file;
|
use roc_cli::build::check_file;
|
||||||
use roc_cli::{
|
use roc_cli::{
|
||||||
build_app, docs, format, repl, BuildConfig, CMD_BUILD, CMD_CHECK, CMD_DOCS, CMD_EDIT,
|
build_app, docs, format, BuildConfig, CMD_BUILD, CMD_CHECK, CMD_DOCS, CMD_EDIT, CMD_FORMAT,
|
||||||
CMD_FORMAT, CMD_REPL, CMD_VERSION, DIRECTORY_OR_FILES, FLAG_TIME, ROC_FILE,
|
CMD_REPL, CMD_VERSION, DIRECTORY_OR_FILES, FLAG_TIME, ROC_FILE,
|
||||||
};
|
};
|
||||||
use roc_load::file::LoadingProblem;
|
use roc_load::file::LoadingProblem;
|
||||||
|
use roc_repl_cli;
|
||||||
use std::fs::{self, FileType};
|
use std::fs::{self, FileType};
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
@ -63,7 +64,7 @@ fn main() -> io::Result<()> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some((CMD_REPL, _)) => {
|
Some((CMD_REPL, _)) => {
|
||||||
repl::main()?;
|
roc_repl_cli::main()?;
|
||||||
|
|
||||||
// Exit 0 if the repl exited normally
|
// Exit 0 if the repl exited normally
|
||||||
Ok(0)
|
Ok(0)
|
||||||
|
|
21
repl_cli/Cargo.toml
Normal file
21
repl_cli/Cargo.toml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
[package]
|
||||||
|
edition = "2021"
|
||||||
|
name = "roc_repl_cli"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bumpalo = {version = "3.8.0", features = ["collections"]}
|
||||||
|
const_format = "0.2.22"
|
||||||
|
rustyline = {git = "https://github.com/rtfeldman/rustyline", tag = "v9.1.1"}
|
||||||
|
rustyline-derive = {git = "https://github.com/rtfeldman/rustyline", tag = "v9.1.1"}
|
||||||
|
target-lexicon = "0.12.2"
|
||||||
|
|
||||||
|
roc_mono = {path = "../compiler/mono"}
|
||||||
|
roc_parse = {path = "../compiler/parse"}
|
||||||
|
roc_repl_eval = {path = "../repl_eval"}
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "roc_repl_cli"
|
||||||
|
path = "src/lib.rs"
|
|
@ -1,13 +1,13 @@
|
||||||
use const_format::concatcp;
|
use const_format::concatcp;
|
||||||
#[cfg(feature = "llvm")]
|
|
||||||
use gen::{gen_and_eval, ReplOutput};
|
|
||||||
use roc_parse::parser::{EExpr, ELambda, SyntaxError};
|
|
||||||
use rustyline::highlight::{Highlighter, PromptInfo};
|
use rustyline::highlight::{Highlighter, PromptInfo};
|
||||||
use rustyline::validate::{self, ValidationContext, ValidationResult, Validator};
|
use rustyline::validate::{self, ValidationContext, ValidationResult, Validator};
|
||||||
use rustyline_derive::{Completer, Helper, Hinter};
|
use rustyline_derive::{Completer, Helper, Hinter};
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::io;
|
use std::io;
|
||||||
|
|
||||||
|
use roc_parse::parser::{EExpr, ELambda, SyntaxError};
|
||||||
|
use roc_repl_eval::gen::{gen_and_eval, ReplOutput};
|
||||||
|
|
||||||
const BLUE: &str = "\u{001b}[36m";
|
const BLUE: &str = "\u{001b}[36m";
|
||||||
const PINK: &str = "\u{001b}[35m";
|
const PINK: &str = "\u{001b}[35m";
|
||||||
const END_COL: &str = "\u{001b}[0m";
|
const END_COL: &str = "\u{001b}[0m";
|
||||||
|
@ -27,11 +27,11 @@ pub const INSTRUCTIONS: &str = "Enter an expression, or :help, or :exit/:q.\n";
|
||||||
pub const PROMPT: &str = concatcp!("\n", BLUE, "»", END_COL, " ");
|
pub const PROMPT: &str = concatcp!("\n", BLUE, "»", END_COL, " ");
|
||||||
pub const CONT_PROMPT: &str = concatcp!(BLUE, "…", END_COL, " ");
|
pub const CONT_PROMPT: &str = concatcp!(BLUE, "…", END_COL, " ");
|
||||||
|
|
||||||
mod app_memory;
|
// mod app_memory;
|
||||||
#[cfg(feature = "llvm")]
|
// #[cfg(feature = "llvm")]
|
||||||
mod eval;
|
// mod eval;
|
||||||
#[cfg(feature = "llvm")]
|
// #[cfg(feature = "llvm")]
|
||||||
mod gen;
|
// mod gen;
|
||||||
|
|
||||||
#[derive(Completer, Helper, Hinter)]
|
#[derive(Completer, Helper, Hinter)]
|
||||||
struct ReplHelper {
|
struct ReplHelper {
|
||||||
|
@ -108,12 +108,6 @@ impl Validator for InputValidator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "llvm"))]
|
|
||||||
pub fn main() -> io::Result<()> {
|
|
||||||
panic!("The REPL currently requires being built with LLVM.");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "llvm")]
|
|
||||||
pub fn main() -> io::Result<()> {
|
pub fn main() -> io::Result<()> {
|
||||||
use rustyline::error::ReadlineError;
|
use rustyline::error::ReadlineError;
|
||||||
use rustyline::Editor;
|
use rustyline::Editor;
|
||||||
|
@ -236,7 +230,6 @@ fn report_parse_error(fail: SyntaxError) {
|
||||||
println!("TODO Gracefully report parse error in repl: {:?}", fail);
|
println!("TODO Gracefully report parse error in repl: {:?}", fail);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "llvm")]
|
|
||||||
fn eval_and_format<'a>(src: &str) -> Result<String, SyntaxError<'a>> {
|
fn eval_and_format<'a>(src: &str) -> Result<String, SyntaxError<'a>> {
|
||||||
use roc_mono::ir::OptLevel;
|
use roc_mono::ir::OptLevel;
|
||||||
use target_lexicon::Triple;
|
use target_lexicon::Triple;
|
27
repl_eval/Cargo.toml
Normal file
27
repl_eval/Cargo.toml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
[package]
|
||||||
|
edition = "2021"
|
||||||
|
name = "roc_repl_eval"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bumpalo = {version = "3.8.0", features = ["collections"]}
|
||||||
|
inkwell = {path = "../vendor/inkwell"}# TODO
|
||||||
|
libloading = "0.7.1" # TODO
|
||||||
|
target-lexicon = "0.12.2"
|
||||||
|
|
||||||
|
roc_build = {path = "../compiler/build", default-features = false, features = ["llvm"]}# TODO
|
||||||
|
roc_builtins = {path = "../compiler/builtins"}
|
||||||
|
roc_can = {path = "../compiler/can"}
|
||||||
|
roc_collections = {path = "../compiler/collections"}
|
||||||
|
roc_fmt = {path = "../compiler/fmt"}
|
||||||
|
roc_gen_llvm = {path = "../compiler/gen_llvm"}# TODO
|
||||||
|
roc_load = {path = "../compiler/load"}
|
||||||
|
roc_module = {path = "../compiler/module"}
|
||||||
|
roc_mono = {path = "../compiler/mono"}
|
||||||
|
roc_parse = {path = "../compiler/parse"}
|
||||||
|
roc_region = {path = "../compiler/region"}
|
||||||
|
roc_reporting = {path = "../reporting"}
|
||||||
|
roc_target = {path = "../compiler/roc_target"}
|
||||||
|
roc_types = {path = "../compiler/types"}
|
|
@ -1,10 +1,9 @@
|
||||||
use crate::repl::app_memory::AppMemoryInternal;
|
use crate::app_memory::AppMemoryInternal;
|
||||||
use crate::repl::eval;
|
use crate::eval;
|
||||||
use bumpalo::Bump;
|
use bumpalo::Bump;
|
||||||
use inkwell::context::Context;
|
use inkwell::context::Context; // TODO
|
||||||
use inkwell::module::Linkage;
|
use inkwell::module::Linkage; // TODO
|
||||||
use roc_build::link::module_to_dylib;
|
use roc_build::{link::module_to_dylib, program::FunctionIterator};
|
||||||
use roc_build::program::FunctionIterator;
|
|
||||||
use roc_can::builtins::builtin_defs_map;
|
use roc_can::builtins::builtin_defs_map;
|
||||||
use roc_collections::all::{MutMap, MutSet};
|
use roc_collections::all::{MutMap, MutSet};
|
||||||
use roc_fmt::annotation::Formattable;
|
use roc_fmt::annotation::Formattable;
|
||||||
|
@ -167,6 +166,10 @@ pub fn gen_and_eval<'a>(
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------
|
||||||
|
START OF LLVM-SPECIFIC STUFF
|
||||||
|
--------------------------------------------------------------------*/
|
||||||
|
|
||||||
let module = arena.alloc(module);
|
let module = arena.alloc(module);
|
||||||
let (module_pass, function_pass) =
|
let (module_pass, function_pass) =
|
||||||
roc_gen_llvm::llvm::build::construct_optimization_passes(module, opt_level);
|
roc_gen_llvm::llvm::build::construct_optimization_passes(module, opt_level);
|
||||||
|
@ -228,6 +231,11 @@ pub fn gen_and_eval<'a>(
|
||||||
|
|
||||||
let lib = module_to_dylib(env.module, &target, opt_level)
|
let lib = module_to_dylib(env.module, &target, opt_level)
|
||||||
.expect("Error loading compiled dylib for test");
|
.expect("Error loading compiled dylib for test");
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------
|
||||||
|
END OF LLVM-SPECIFIC STUFF
|
||||||
|
--------------------------------------------------------------------*/
|
||||||
|
|
||||||
let res_answer = unsafe {
|
let res_answer = unsafe {
|
||||||
eval::jit_to_ast(
|
eval::jit_to_ast(
|
||||||
&arena,
|
&arena,
|
4
repl_eval/src/lib.rs
Normal file
4
repl_eval/src/lib.rs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
mod app_memory;
|
||||||
|
// mod debug; TODO: Is this in the right place? Seems to be specifically for solve.rs
|
||||||
|
mod eval;
|
||||||
|
pub mod gen;
|
Loading…
Add table
Add a link
Reference in a new issue