Commit the old list implementation
This commit is contained in:
parent
fa9c51e71c
commit
bb83142ffd
|
@ -1,2 +1,3 @@
|
||||||
(defn hello! (name)
|
(def a 4)
|
||||||
(println "Hello %s" name))
|
;; (defn hello! (name)
|
||||||
|
;; (println "Hello %s" name))
|
||||||
|
|
|
@ -15,7 +15,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
use crate::compiler::Compiler;
|
use crate::compiler::Compiler;
|
||||||
use crate::types::{ExprResult, Expression, List, Number, Symbol};
|
use crate::types::collections;
|
||||||
|
use crate::types::{ExprResult, Expression, Number, Symbol};
|
||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq, Clone)]
|
#[derive(Debug, Eq, PartialEq, Clone)]
|
||||||
pub enum Expr {
|
pub enum Expr {
|
||||||
|
@ -24,14 +25,14 @@ pub enum Expr {
|
||||||
Num(Number),
|
Num(Number),
|
||||||
Comment,
|
Comment,
|
||||||
Error(String),
|
Error(String),
|
||||||
Cons(Box<List>),
|
List(Box<collections::List>),
|
||||||
Nil,
|
Nil,
|
||||||
NoMatch,
|
NoMatch,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Expr {
|
impl Expr {
|
||||||
pub fn make_list(first: Expr, rest: Expr) -> Expr {
|
pub fn make_list(first: Expr, rest: Expr) -> Expr {
|
||||||
Expr::Cons(Box::new(List::new(first, rest)))
|
Expr::List(Box::new(collections::List::new(first, rest)))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn make_symbol(v: String) -> Expr {
|
pub fn make_symbol(v: String) -> Expr {
|
||||||
|
@ -52,6 +53,7 @@ impl Expression for Expr {
|
||||||
fn code_gen<'ctx>(&self, compiler: &'ctx Compiler) -> ExprResult<'ctx> {
|
fn code_gen<'ctx>(&self, compiler: &'ctx Compiler) -> ExprResult<'ctx> {
|
||||||
match self {
|
match self {
|
||||||
Expr::Sym(s) => s.code_gen(compiler),
|
Expr::Sym(s) => s.code_gen(compiler),
|
||||||
|
Expr::Cons(s) => s.code_gen(compiler),
|
||||||
_ => Err("NotImplemented".to_string()),
|
_ => Err("NotImplemented".to_string()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,25 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
use crate::compiler::Compiler;
|
use crate::compiler::Compiler;
|
||||||
|
use crate::types::collections::core::{first, rest};
|
||||||
use crate::types::{ExprResult, List};
|
use crate::types::{ExprResult, List};
|
||||||
|
|
||||||
pub fn def<'a>(compiler: &'a Compiler, args: &'a List) -> ExprResult<'a> {
|
pub fn def<'a>(compiler: &'a Compiler, args: &'a List) -> ExprResult<'a> {
|
||||||
Err("Not implemented".to_string())
|
// TODO: We need to support docstrings for def
|
||||||
|
if args.length != 3 {
|
||||||
|
// TODO: Raise a meaningful error by including the location
|
||||||
|
panic!(format!(
|
||||||
|
"`def` expects 2 parameters, '{}' given.",
|
||||||
|
args.length
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
//let def_ = &args.first;1
|
||||||
|
let name = first(rest(args));
|
||||||
|
//let value = first(rest(rest(args)));
|
||||||
|
|
||||||
|
println!("<<<< {:?}", name);
|
||||||
|
// TODO: make sure that `def_` is a symbol and its name is "def"
|
||||||
|
|
||||||
|
Err("Is not completed".to_string())
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@ fn main() -> io::Result<()> {
|
||||||
match reader::read_string(&buf) {
|
match reader::read_string(&buf) {
|
||||||
Ok(v) => {
|
Ok(v) => {
|
||||||
println!("AST: {:#?}", v);
|
println!("AST: {:#?}", v);
|
||||||
|
|
||||||
let g = compiler::compile(&compiler, v);
|
let g = compiler::compile(&compiler, v);
|
||||||
println!("GEN: {:?}", g)
|
println!("GEN: {:?}", g)
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,12 +14,12 @@
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
pub mod collections;
|
||||||
pub mod core;
|
pub mod core;
|
||||||
pub mod list;
|
|
||||||
pub mod number;
|
pub mod number;
|
||||||
pub mod symbol;
|
pub mod symbol;
|
||||||
|
|
||||||
|
pub use self::collections::{List, Seq};
|
||||||
pub use self::core::{ExprResult, Expression};
|
pub use self::core::{ExprResult, Expression};
|
||||||
pub use self::list::List;
|
|
||||||
pub use self::number::Number;
|
pub use self::number::Number;
|
||||||
pub use self::symbol::Symbol;
|
pub use self::symbol::Symbol;
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
/** Serene --- Yet an other Lisp
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020 Sameer Rahmani <lxsameer@gnu.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
pub mod core;
|
||||||
|
pub mod list;
|
||||||
|
|
||||||
|
pub use self::core::Seq;
|
||||||
|
pub use self::list::List;
|
|
@ -0,0 +1,40 @@
|
||||||
|
/** Serene --- Yet an other Lisp
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020 Sameer Rahmani <lxsameer@gnu.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
pub trait Seq<T> {
|
||||||
|
fn first(&self) -> &T;
|
||||||
|
fn rest(&self) -> Option<&Self>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn first<'a, T, S: Seq<T>>(coll: impl Into<Option<&'a S>>) -> Option<&'a T>
|
||||||
|
where
|
||||||
|
S: 'a,
|
||||||
|
{
|
||||||
|
coll.into().and_then(first)
|
||||||
|
// match coll.into() {
|
||||||
|
// Some(v) => Some(v.first()),
|
||||||
|
// None => None,
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rest<'a, T, S: Seq<T>>(coll: impl Into<Option<&'a S>>) -> Option<&'a S> {
|
||||||
|
coll.into().and_then(rest)
|
||||||
|
// match coll.into() {
|
||||||
|
// Some(v) => v.rest(),
|
||||||
|
// None => None,
|
||||||
|
// }
|
||||||
|
}
|
|
@ -15,15 +15,18 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
use crate::ast::Expr;
|
use crate::ast::Expr;
|
||||||
|
use crate::builtins::def;
|
||||||
use crate::compiler::Compiler;
|
use crate::compiler::Compiler;
|
||||||
|
use crate::types::collections::core::Seq;
|
||||||
use crate::types::core::{ExprResult, Expression};
|
use crate::types::core::{ExprResult, Expression};
|
||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq, Clone)]
|
#[derive(Debug, Eq, PartialEq, Clone)]
|
||||||
pub struct List {
|
pub struct List {
|
||||||
first: Expr,
|
pub car: Expr,
|
||||||
rest: Expr,
|
pub cdr: Expr,
|
||||||
length: u64,
|
pub length: u64,
|
||||||
}
|
}
|
||||||
|
//pub enum List<T> { Nil, Cons(T, Box<List<T>>) }
|
||||||
|
|
||||||
impl List {
|
impl List {
|
||||||
pub fn new(first: Expr, rest: Expr) -> List {
|
pub fn new(first: Expr, rest: Expr) -> List {
|
||||||
|
@ -43,8 +46,8 @@ impl List {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
first,
|
car: first,
|
||||||
rest,
|
cdr: rest,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,6 +55,25 @@ impl List {
|
||||||
impl Expression for List {
|
impl Expression for List {
|
||||||
fn eval() {}
|
fn eval() {}
|
||||||
fn code_gen<'ctx>(&self, compiler: &'ctx Compiler) -> ExprResult<'ctx> {
|
fn code_gen<'ctx>(&self, compiler: &'ctx Compiler) -> ExprResult<'ctx> {
|
||||||
|
// match &self.car {
|
||||||
|
// Expr::Sym(s) => def(compiler, self),
|
||||||
|
// _ => ,
|
||||||
|
// }
|
||||||
|
def(compiler, self);
|
||||||
Err("Not implemented on list".to_string())
|
Err("Not implemented on list".to_string())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Seq<Expr> for List {
|
||||||
|
fn first<'a>(&'a self) -> &'a Expr {
|
||||||
|
&self.car
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rest<'a>(&'a self) -> Option<&'a List> {
|
||||||
|
match &self.cdr {
|
||||||
|
Expr::Nil => None,
|
||||||
|
Expr::Cons(v) => Some(v),
|
||||||
|
_ => panic!("'rest' should not match anything else!"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue