about summary refs log blame commit diff stats
path: root/shell/data.limg
blob: 407af097ff56ace808190a4132f7d0c2b9e5770f (plain) (tree)
1
2
3
4
5
6
7
8
9
10

              



                                           



                                            

                                    


                                            
                  



                                    
                                       
        

                                    

                       
     
                         
                          
            
            
                        

                            

                      

                                 
          
                         



                                            

                            
      
                   
        
                         
                             

                          
     
                   
                      


                            
      
                     
       
                         




                            

                                     

                                       
             
                                    
                                   
               

                                      
           
                
         
                            




                                   
                


                          
      

                             
            


                              
      

                              
                            
              












                                   


                                                
                                                 


                  
                  


                                         
                                      
                                          

                        
                                       

                                


                                

                                       
                                                          
                       
                                  
                                             
                         

                                 
                    

                                           
                                
                                 
                         
                            

                          

                         
                                

                                       
    
                                        
 
(
  (globals . (
    (mac . [define mac
  (litmac litfn () ((m . params) . body)
    `(define ,m
       (litmac litfn () ,params ,@body)))])
    (def . [mac (def (name . params) . body)
  `(define ,name (fn ,params ,@body))])
    (do . [mac (do . body)
  `((fn () ,@body))])
    (let . [mac (let var val . body)
  `((fn (,var) ,@body) ,val)])
    (when . [mac (when cond . body)
  `(if ,cond (do ,@body) ())])
    (iflet . [mac (iflet var expr then else)
  `(let ,var ,expr
     (if ,var ,then ,else))])
    (aif . [mac (aif expr then else)
  `(iflet it ,expr ,then ,else)])
    (list . [def (list . args)
  # we should probably make a copy here
  args])
    (ret . [mac (ret var val . body)
  `(let ,var ,val ,@body ,var)])
    (len . [def (len l)
  if (no l)
    0
    (1 + (len (cdr l)))])
    (nth . [def (nth n xs)
  if (n < 1)
    (car xs)
    (nth n-1 (cdr xs))])
    (map1 . [def (map1 f xs)
  if (no xs)
    ()
    (cons (f (car xs))
          (map1 f (cdr xs)))])
    (compose . [def (compose f g)
  (fn args
    (f (apply g args)))])
    (caar . [define caar (compose car car)])
    (cadr . [define cadr (compose car cdr)])
    (cddr . [define cddr (compose cdr cdr)])
    (cdar . [define cdar (compose cdr car)])
    (some . [def (some f xs)
  if (no xs)
    ()
    if (f (car xs))
      xs
      (some f (cdr xs))])
    (any . [define any some])
    (all . [def (all f xs)
  if (no xs)
    1
    if (f (car xs))
      (all f (cdr xs))
      ()])
    (find . [def (find x xs)
  if (no xs)
    ()
    if (x = (car xs))
      1
      (find x (cdr xs))])
    (pair . [def (pair xs)
  if (no xs)
    ()
    if (no (cdr xs))
      (list (list (car xs)))
      (cons (list (car xs) (cadr xs))
            (pair (cddr xs)))])
    (with . [mac (with bindings . body)
  `((fn ,(map1 car (pair bindings))
      ,@body)
    ,@(map1 cadr (pair bindings)))])
    (afn . [mac (afn params . body)
  `(let self ()
     (set self (fn ,params ,@body)))])
    (seq . [def (seq n)
  ((afn (i)
     (if (i > n)
       ()
       (cons i (self i+1))))
   1)])
    (each . [mac (each x xs . body)
  `(walk ,xs (fn (,x) ,@body))])
    (walk . [def (walk xs f)
  when xs
    (f (car xs))
    (walk (cdr xs) f)])
    (rem . [def (rem f xs)
  if (no xs)
    ()
    let rest (rem f (cdr xs))
      if (f (car xs))
        rest
        (cons (car xs) rest)])
    (keep . [def (keep f xs)
  if (no xs)
    ()
    let rest (keep f (cdr xs))
      if (f (car xs))
        (cons (car xs) rest)
        rest])
    (alist? . [def (alist? x)
  (and (cons? x)
       (cons? (car x)))])
    (assoc . [def (assoc alist key)
  if (no alist)
    ()
    if (key = (caar alist))
      (car alist)
      (assoc (cdr alist) key)])
    (get . [def (get alist key)
  aif (assoc alist key)
    (cdr it)
    ()])
    (++ . [mac (++ var) `(set ,var (,var + 1))])
    (+= . [mac (var += inc)
  `(set ,var (,var + ,inc))])
    (for . [mac (for var init test update . body)
  `(let ,var ,init
     (while ,test
       ,@body
       ,update))])
    (hborder . [def (hborder scr y color)
  (hline scr y 0 (width scr) color)])
    (vborder . [def (vborder scr x color)
  (vline scr x 0 (height scr) color)])
    (read_line . [def (read_line keyboard)
  ret str (stream)
    let c (key keyboard)
      while (not (or (c = 0) (c = 10)))
        (write str c)
        (set c (key keyboard))])
    (wait . [def (wait keyboard)
  while (= 0 (key keyboard))
    ()])
    (sq . [def (sq n) (n * n)])
    (cube . [def (cube n) (n * n * n)])
    (fill_rect . [def (fill_rect screen x1 y1 x2 y2 color)
  for y y1 (y < y2) ++y
    (hline screen y x1 x2 color)])
    (ring . [def (ring screen cx cy r0 w clr)
  for r r0 (r < r0+w) ++r
    (circle screen cx cy r clr)])
    (Greys . [define Greys
  (map1 (fn(n) n+15)
        (seq 16))])
    (Pinks . [define Pinks '(84 85 59 60 61
               13 36 37 5 108)])
    (palette . [def (palette p i)
  (nth (i % (len p)) p)])
    (pat . [def (pat screen)
  with (w (width screen)
        h (height screen))
    for y 0 (y < h) ++y
      for x 0 (x < w) ++x
        (pixel screen x y x*y)])
    (main . [def (main screen keyboard)
  (pat screen)])
  ))
  (sandbox . [circle screen 35 35 14 3])
)