File: contrl.txt

package info (click to toggle)
maxima 5.6-17
  • links: PTS
  • area: main
  • in suites: woody
  • size: 30,572 kB
  • ctags: 47,715
  • sloc: ansic: 154,079; lisp: 147,553; asm: 45,843; tcl: 16,744; sh: 11,057; makefile: 7,198; perl: 1,842; sed: 334; fortran: 24; awk: 5
file content (41 lines) | stat: -rw-r--r-- 1,068 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/*-*-MACSYMA-*-*/

HERALD_PACKAGE(CONTRL)$

EVAL_WHEN([TRANSLATE,BATCH,DEMO],
          LOAD_PACKAGE(SHAREM,"DSK:SHAREM\;AUTOLOAD FASL"))$

/* COND CASEQ CASE */

EVAL_WHEN([TRANSLATE,BATCH,DEMO,LOADFILE],

COND([L])::=
 IF L=[] THEN BUILDQ([],ERROR("Conditional fails"))
 ELSE BUILDQ([PRED:POP(L),
             STATEMENT:IF L=[] THEN ERROR("Odd number of COND args") ELSE POP(L),
	     L],
	     IF PRED THEN STATEMENT ELSE COND(SPLICE(L)))
)$

CASEQ(EXP,[L])::=
 BLOCK([PREDT],	     
  COND(NOT ATOM(EXP),
       BUILDQ([G:?GENSYM(),EXP,L],BLOCK([G:EXP],CASEQ(G,SPLICE(L)))),

       L=[],
       BUILDQ([],ERROR("Caseq fails")),

       (PREDT:POP(L),L=[]),
       ERROR("Odd number of CASEQ case args"),
       
       TRUE,
       BUILDQ([STATEMENT:POP(L),PREDT,EXP,L],
              IF MEMBERQ(EXP,PREDT) THEN STATEMENT ELSE CASEQ(EXP,SPLICE(L)))))$

/* mainly as a helper macro for CASEQ */

MEMBERQ(X,L)::=
 COND(NOT LISTP(L), ERROR("Second arg to MEMBERQ must be list"),
      L=[],     FALSE,
      TRUE, BUILDQ([X,Y:POP(L),L],X='Y OR MEMBERQ(X,L))
      )$