Plaster

common-lisp
x
 
1
(defvar *program*
2
  '(my $min-t = $raw div 60             ;
3
    my $sec   = $raw - ( $min-t * 60 )  ;
4
    my $hr-t  = $min-t div 60           ;
5
    my $min   = $min-t - ( $hr-t * 60 ) ;
6
    my $day-t = $hr-t div 24            ;
7
    my $hr    = $hr-t - ( $day-t * 24 ) ;
8
    my $yr    = $day-t div 365          ;
9
    my $day   = $day-t - ( $yr * 365 )  ;
10
   
11
    say |Year:| $yr |Day:| $day |Hour:| $hr |Min:| $min |Sec:| $sec ;
12
    }))
13
14
(defun result (program)
15
  (cond ((null program) nil)
16
        ((numberp program) program)
17
        ((and (symbolp program) (boundp program))
18
         (symbol-value program))
19
        ((eq program '}) '|:)|)
20
        ((symbolp program)
21
         program)
22
        ((eq (car program) 'my)
23
         (let* ((lhs (cadr program))
24
                (rest (member-if (lambda (x) (member x '(my say })))
25
                                 (cdddr program)))
26
                (rhs (ldiff (cdddr program) rest)))
27
           (progv (list lhs) (list (result rhs))
28
             (result rest))))
29
        ((eq (cadr program) '*)
30
         (* (result (car program))
31
            (result (caddr program))))
32
        ((eq (cadr program) 'div)
33
         (truncate (result (car program))
34
                   (result (caddr program))))
35
        ((eq (cadr program) '-)
36
         (- (result (car program))
37
            (result (caddr program))))
38
        ((eq (car program) 'say)
39
         (dolist (arg (cdr program))
40
           (princ (result arg))
41
           (princ " ")))))
42
43
(defun test ()
44
  (progv '($raw) '(123456789)
45
    (result *program*)))
46