BSD 4_3_Reno release
[unix-history] / usr / src / pgrm / lisp / lisplib / ucido.l
CommitLineData
4b9ccde7
C
1(setq SCCS-ucido "@(#)ucido.l 1.3 6/29/81")
2;
3; ucilisp do loop, this is a seperate file due to conflicts with
4; the franz lisp do function. To use this, one needs
5; to load this file in at run time. (And have calls to
6; do be close compiled in compiled code).
7;
8; NOTE: do is a macro and must be declared before calls to it
9; in code to be compiled!
10;
11; to compile this file: liszt ucido.l
12;
13(declare (macros t))
14
15(eval-when (compile)
16 (load 'ucifnc))
17
18(defun do macro (l)
19 ((lambda (dotype alist)
20 (cond ((eq dotype 'while)
21 (dowhile (car alist) (cdr alist)))
22 ((eq dotype 'until)
23 (dowhile (list 'not (car alist))
24 (cdr alist)))
25 ((eq dotype 'for)
26 (dofor (car alist)
27 (cadr alist)
28 (caddr alist)
29 (cdddr alist)))
30 (t `((lambda ()
31 ,@alist)))))
32 (cadr l)
33 (cddr l)))
34
35(defun dowhile (expr alist)
36 `(prog (returnvar)
37 loop
38 (cond (,expr
39 (setq returnvar ((lambda ()
40 ,@alist)))
41 (go loop))
42 (t (return returnvar)))))
43
44(defun dofor (var fortype varlist stmlist)
45 (selectq fortype
46 (in `(prog (returnvar l1 l2)
47 (setq l2 ',varlist)
48 loop
49 (setq l1 (car l2))
50 (setq l2 (cdr l2))
51 (cond ((null l1)
52 (return returnvar)))
53 (setq returnvar
54 ((lambda (,var)
55 ,@stmlist)
56 (l1)))
57 (go loop)))
58 (on `(prog (returnvar l1 l2)
59 (setq l2 ',varlist)
60 loop
61 (cond ((null l2)
62 (return returnvar)))
63 (setq returnvar
64 ((lambda (,var)
65 ,@stmlist)
66 (l2)))
67 (setq l2 (cdr l2))
68 (go loop)))
69 (rpt `(prog (returnvar ,var)
70 (setq ,var 1)
71 loop
72 (cond ((not (> ,var ,varlist))
73 (setq returnvar ((lambda ()
74 ,@stmlist)))
75 (setq ,var (1+ ,var))
76 (go loop))
77 (t (return returnvar)))))
78 nil))