lambda (sort of)
[jscl.git] / lispstrack.lisp
1 (defun ls-compile (sexp &optional env)
2   (cond
3     ((symbolp sexp) (format nil "V_~a" sexp))
4     ((integerp sexp) (format nil " ~a " sexp))
5     ((stringp sexp) (format nil " \"~a\" " sexp))
6     ; list
7     ((case (first sexp)
8        (if (format nil "((~a)? (~a) : (~a))"
9                    (ls-compile (second sexp))
10                    (ls-compile (third sexp))
11                    (ls-compile (fourth sexp))))
12        (lambda (concat "(function ("
13                 (format nil "~{V_~a~^, ~}" (second sexp))
14                 "){ "
15                 (ls-compile-block (cddr sexp) env)
16                 "})
17 "))                     ; (function (params) { body })
18        (t nil)))))
19
20 ;;; simplify me, please
21 (defun concat (&rest strs)
22   (reduce (lambda (s1 s2) (concatenate 'string s1 s2))
23           strs
24           :initial-value ""))
25
26 (defun ls-compile-block (sexps env)
27   (format nil
28           "~{~#[~; return ~a;~:;~a;~%~]~}"
29           (mapcar #'(lambda (x)
30                       (ls-compile x env))
31                   sexps)))
32
33 (defparameter *env* '())
34
35
36 (defparameter *env-fun* '())