add concat
This commit is contained in:
parent
af14eaee72
commit
ad6fcccc79
34
src/base.rs
34
src/base.rs
|
@ -1,7 +1,6 @@
|
|||
use crate::value::*;
|
||||
use crate::vm::*;
|
||||
use imbl::*;
|
||||
use std::rc::Rc;
|
||||
// use imbl::*;
|
||||
// use std::fmt;
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
@ -81,7 +80,7 @@ pub fn chars<'src>(x: &Value<'src>) -> Value<'src> {
|
|||
Value::InternedString(s) => {
|
||||
let chars = s.chars();
|
||||
|
||||
let mut charlist = imbl::vector![];
|
||||
let mut charlist = vector![];
|
||||
for char in chars {
|
||||
if char.is_ascii() {
|
||||
charlist.push_back(Value::AllocatedString(Rc::new(char.to_string())))
|
||||
|
@ -99,7 +98,7 @@ pub fn chars<'src>(x: &Value<'src>) -> Value<'src> {
|
|||
Value::AllocatedString(s) => {
|
||||
let chars = s.chars();
|
||||
|
||||
let mut charlist = imbl::vector![];
|
||||
let mut charlist = vector![];
|
||||
for char in chars {
|
||||
if char.is_ascii() {
|
||||
charlist.push_back(Value::AllocatedString(Rc::new(char.to_string())))
|
||||
|
@ -118,6 +117,30 @@ pub fn chars<'src>(x: &Value<'src>) -> Value<'src> {
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: figure out how to get to opportunistic mutation here
|
||||
pub fn concat<'src>(x: &Value<'src>, y: &Value<'src>) -> Value<'src> {
|
||||
match (x, y) {
|
||||
(Value::InternedString(x), Value::InternedString(y)) => {
|
||||
Value::AllocatedString(Rc::new(format!("{x}{y}")))
|
||||
}
|
||||
(Value::AllocatedString(x), Value::AllocatedString(y)) => {
|
||||
Value::AllocatedString(Rc::new(format!("{x}{y}")))
|
||||
}
|
||||
(Value::AllocatedString(x), Value::InternedString(y)) => {
|
||||
Value::AllocatedString(Rc::new(format!("{x}{y}")))
|
||||
}
|
||||
(Value::InternedString(x), Value::AllocatedString(y)) => {
|
||||
Value::AllocatedString(Rc::new(format!("{x}{y}")))
|
||||
}
|
||||
(Value::List(x), Value::List(y)) => {
|
||||
let mut newlist = x.clone();
|
||||
newlist.append(y.clone());
|
||||
Value::List(newlist)
|
||||
}
|
||||
_ => unreachable!("internal Ludus error"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn base<'src>() -> Vec<(&'src str, Value<'src>)> {
|
||||
vec![
|
||||
("eq?", Value::Base(Base::Binary(eq))),
|
||||
|
@ -130,6 +153,7 @@ pub fn base<'src>() -> Vec<(&'src str, Value<'src>)> {
|
|||
("assoc", Value::Base(Base::Ternary(assoc))),
|
||||
("bool", Value::Base(Base::Unary(r#bool))),
|
||||
("chars", Value::Base(Base::Unary(chars))),
|
||||
("concat", Value::Base(Base::Binary(concat))),
|
||||
]
|
||||
}
|
||||
|
||||
|
@ -138,7 +162,7 @@ pub fn base<'src>() -> Vec<(&'src str, Value<'src>)> {
|
|||
// * [ ] atan_2 (x) -> number
|
||||
// * [x] bool (x) -> bool
|
||||
// * [ ] ceil (x) -> number
|
||||
// * [ ] chars (x) -> list
|
||||
// * [x] chars (x) -> list
|
||||
// * [ ] concat (x, y) -> value
|
||||
// * [ ] conj (x, y) -> list
|
||||
// * [ ] cos (x) -> number
|
||||
|
|
|
@ -58,7 +58,8 @@ use crate::base::*;
|
|||
|
||||
pub fn main() {
|
||||
let src = "
|
||||
chars (\"féo\")
|
||||
let foo = [1, 2, 3]
|
||||
concat(foo, [4, 5, 6])
|
||||
";
|
||||
let (tokens, lex_errs) = lexer().parse(src).into_output_errors();
|
||||
if !lex_errs.is_empty() {
|
||||
|
|
Loading…
Reference in New Issue
Block a user