Skip to content

Commit bd2746e

Browse files
committed
start stdlib
1 parent ec11a07 commit bd2746e

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
mod eval;
22
mod lex;
33
mod parse;
4+
mod stdlib;
45

56
fn main() {
67
println!("Hello, world!");

src/stdlib.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use super::eval::{eval_sequence, Env, EnvPtr, Value};
2+
use super::lex::scan;
3+
use super::parse::parse;
4+
5+
fn define(env: EnvPtr) {
6+
let stdlib = "
7+
(define list (lambda (. rest) rest))
8+
(define null? (lambda (v) (= v ())))
9+
(define list? (lambda (v)
10+
(if (empty? v)
11+
#t
12+
(if (not (pair? v))
13+
#f
14+
(list? (cdr v))))))
15+
";
16+
eval_sequence(&parse(&scan(stdlib).unwrap()).unwrap(), env).unwrap();
17+
}
18+
19+
#[test]
20+
fn test() {
21+
let env = Env::root().into_ptr();
22+
define(env.clone());
23+
24+
let cases = &[(
25+
"(list 1 2 3)",
26+
Value::make_list(&[
27+
Value::Number(1.0).into_ptr(),
28+
Value::Number(2.0).into_ptr(),
29+
Value::Number(3.0).into_ptr(),
30+
]),
31+
("(null? ())", Value::Boolean(true)),
32+
("(null? #f", Value::Boolean(false)),
33+
("(list? ()", Value::Boolean(true)),
34+
("(list? (list 1)", Value::Boolean(true)),
35+
("(list? 1234)", Value::Boolean(false)),
36+
("(list? (cons 1 2))", Value::Boolean(false)),
37+
)];
38+
39+
for c in cases.iter() {
40+
let got = eval_sequence(&parse(&scan(c.0).unwrap()).unwrap(), env.clone()).unwrap();
41+
assert_eq!(&*got.borrow(), &c.1, "src: {}", c.0);
42+
}
43+
}

0 commit comments

Comments
 (0)