RCSNUSP/PicoLisp

From Rosetta Code
Revision as of 10:42, 10 October 2014 by Mihailp (talk | contribs) (add code.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

snusp.l <lang PicoLisp>(load "@lib/simul.l")

(de snusp (L)

  (let
     (M (length (maxi length L))
        Grid (grid M (length L)) 
        L 
           (mapcar
              '((I) (need (- M) I " "))
              L ) )
     (println 'L L)
     (mapc
        '((G L)
           (mapc '((This Val) (=: V Val)) G L) )
        Grid
        (apply mapcar (reverse (mapcar chop L)) list) )
     
     # Debug
     #(disp Grid 0 '((This) (align 3 (: V))))         
     
     (let 
        (This
           (or
              (find
                 '((I) I)
                 (mapcar
                    '((I)
                       (find 
                          '((This) (= (: V) '$))
                          I ) )
                 Grid ) )   
              (last (car Grid)) )
           Dir 'east
           S NIL
           D (list 0)
           DH 1 
           DL 1 )
        
        (loop
           (case (: V)
              (>
                 (inc 'DH)
                 (when (> DH DL)
                    (setq D (insert DH D 0))
                    (inc 'DL) ) )
              (<
                 (dec 'DH)
                 (when (< DH 1)
                    (setq D (insert DH D 0))
                    (inc 'DL)
                    (one DH) ) )
              (+ (inc (nth D DH)))
              (- (dec (nth D DH)))
              (. (prin (char (get D DH))))
              (! (setq This (Dir This)))
              (?
                 (when (=0 (get D DH))
                    (setq This (Dir This)) ) )
              ("," (set (nth D DH) (char (key))))
              (@ (push 'S (list This Dir)))
              ("#"
                 (if (car S)
                    (prog1
                       (pop 'S)
                       (setq This (car @)  Dir (cadr @))
                       (setq This (Dir This)) )
                    (off This) ) )
              (/
                 (setq Dir
                    (case Dir
                       (east 'north)
                       (north 'east)
                       (west 'south)
                       (south 'west) ) ) )
              (\\
                 (setq Dir
                    (case Dir
                       (west 'north)
                       (north 'west)
                       (east 'south)
                       (south 'east) ) ) ) )
           (setq This (Dir This))
           (NIL This) ) ) ) )
           

(when (argv)

  (snusp
     (in (car (argv)) (split (till) "^J")) ) )
     

(bye)</lang>