aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/app.rs8
-rw-r--r--src/lisp/prelude.rs46
-rw-r--r--src/lisp/std.lisp15
-rw-r--r--src/main.rs3
4 files changed, 57 insertions, 15 deletions
diff --git a/src/app.rs b/src/app.rs
index 2e14dbc..5ba8fb1 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -832,13 +832,7 @@ impl<'ctx> AppState<'ctx> {
832 end, 832 end,
833 active_end, 833 active_end,
834 }); 834 });
835 } else if end.is_none() { 835 } else if end.is_none() || active_end {
836 self.brush = Brush::RectSelect(RectSelectBrush {
837 start,
838 end: contact,
839 active_end,
840 });
841 } else if active_end {
842 self.brush = Brush::RectSelect(RectSelectBrush { 836 self.brush = Brush::RectSelect(RectSelectBrush {
843 start, 837 start,
844 end: contact, 838 end: contact,
diff --git a/src/lisp/prelude.rs b/src/lisp/prelude.rs
index d6e1874..7cb46ff 100644
--- a/src/lisp/prelude.rs
+++ b/src/lisp/prelude.rs
@@ -42,8 +42,8 @@ macro_rules! type_match {
42 let mut temp_vec = vec![]; 42 let mut temp_vec = vec![];
43 $( 43 $(
44 temp_vec.push(matches!(&$args[$range], $kind)); 44 temp_vec.push(matches!(&$args[$range], $kind));
45 )+ 45 )+
46 temp_vec.iter().all(|&t| t) 46 temp_vec.iter().all(|&t| t)
47 } 47 }
48 }; 48 };
49 ($args:expr, $($range:expr => $kind:pat),+) => { 49 ($args:expr, $($range:expr => $kind:pat),+) => {
@@ -54,8 +54,8 @@ macro_rules! type_match {
54 for arg in arg_range { 54 for arg in arg_range {
55 temp_vec.push(matches!(arg, $kind)); 55 temp_vec.push(matches!(arg, $kind));
56 } 56 }
57 )+ 57 )+
58 temp_vec.iter().all(|&t| t) 58 temp_vec.iter().all(|&t| t)
59 } 59 }
60 } 60 }
61} 61}
@@ -139,6 +139,17 @@ pub fn new_env() -> Result<Environment, LispError> {
139 } 139 }
140 }); 140 });
141 141
142 primitive!(env, Arity::Exact(1), "integer", |args, _| {
143 if type_match!(args, 0 => LispExpr::Number(_)) {
144 Ok(LispExpr::Number(match args[0].unwrap_number() {
145 LispNumber::Float(f) => LispNumber::Integer(f as i64),
146 s => s,
147 }))
148 } else {
149 Err(EvalError::TypeMismatch.into())
150 }
151 });
152
142 primitive!(env, Arity::Atleast(1), "begin", |args, _| { 153 primitive!(env, Arity::Atleast(1), "begin", |args, _| {
143 Ok(args.iter().last().unwrap().clone()) 154 Ok(args.iter().last().unwrap().clone())
144 }); 155 });
@@ -394,9 +405,9 @@ pub fn new_env() -> Result<Environment, LispError> {
394 405
395 primitive!(env, Arity::Exact(3), "set-pixel!", |args, app| { 406 primitive!(env, Arity::Exact(3), "set-pixel!", |args, app| {
396 if type_match!( 407 if type_match!(
397 args, 0 => LispExpr::Number(LispNumber::Integer(_)), 408 args, 0 => LispExpr::Number(LispNumber::Integer(_)),
398 1 => LispExpr::Number(LispNumber::Integer(_)), 409 1 => LispExpr::Number(LispNumber::Integer(_)),
399 2 => LispExpr::BoolLit(_) 410 2 => LispExpr::BoolLit(_)
400 ) { 411 ) {
401 let x = args[0].unwrap_number(); 412 let x = args[0].unwrap_number();
402 let y = args[1].unwrap_number(); 413 let y = args[1].unwrap_number();
@@ -418,6 +429,27 @@ pub fn new_env() -> Result<Environment, LispError> {
418 } 429 }
419 }); 430 });
420 431
432 primitive!(env, Arity::Exact(2), "get-pixel", |args, app| {
433 if type_match!(
434 args,
435 0 => LispExpr::Number(LispNumber::Integer(_)),
436 1 => LispExpr::Number(LispNumber::Integer(_))
437 ) {
438 let x = args[0].unwrap_number();
439 let y = args[1].unwrap_number();
440 let get_loc: MapPoint = (x.unwrap_integer(), y.unwrap_integer())
441 .try_into()
442 .map_err(|_| -> LispError { EvalError::InvalidCoordinates((x, y)).into() })?;
443 if !app.pixmap.contains(get_loc) {
444 Err(EvalError::InvalidCoordinates((x, y)).into())
445 } else {
446 Ok(LispExpr::BoolLit(app.pixmap.get(get_loc)))
447 }
448 } else {
449 Err(EvalError::TypeMismatch.into())
450 }
451 });
452
421 primitive!(env, Arity::Exact(0), "commit", |_, app| { 453 primitive!(env, Arity::Exact(0), "commit", |_, app| {
422 app.commit_operation(); 454 app.commit_operation();
423 Ok(LispExpr::Unit) 455 Ok(LispExpr::Unit)
diff --git a/src/lisp/std.lisp b/src/lisp/std.lisp
index 6c5beed..a256125 100644
--- a/src/lisp/std.lisp
+++ b/src/lisp/std.lisp
@@ -40,6 +40,13 @@
40 (cons (func (car ls)) 40 (cons (func (car ls))
41 (map func (cdr ls))))) 41 (map func (cdr ls)))))
42 42
43(define (zip l1 l2)
44 (if (or (null? l1)
45 (null? l2))
46 '()
47 (cons (cons (car l1) (car l2))
48 (zip (cdr l1) (cdr l2)))))
49
43(define (filter pred ls) 50(define (filter pred ls)
44 (if (null? ls) 51 (if (null? ls)
45 '() 52 '()
@@ -57,3 +64,11 @@
57 64
58(define (sum ls) (fold 0 + ls)) 65(define (sum ls) (fold 0 + ls))
59(define (product ls) (fold 1 * ls)) 66(define (product ls) (fold 1 * ls))
67
68(define (reverse ls)
69 (begin
70 (define (rev-helper p acc)
71 (if (null? p)
72 acc
73 (rev-helper (cdr p) (cons (car p) acc))))
74 (rev-helper ls '())))
diff --git a/src/main.rs b/src/main.rs
index d6f0204..225c37c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,7 +1,8 @@
1#![allow( 1#![allow(
2 clippy::upper_case_acronyms, 2 clippy::upper_case_acronyms,
3 clippy::vec_init_then_push, 3 clippy::vec_init_then_push,
4 clippy::unsound_collection_transmute 4 clippy::unsound_collection_transmute,
5 clippy::new_without_default
5)] 6)]
6 7
7mod app; 8mod app;