home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume8 / elk / part04 < prev    next >
Encoding:
Text File  |  1989-09-23  |  56.9 KB  |  1,855 lines

  1. Newsgroups: comp.sources.misc
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Subject: v08i052: Elk (Extension Language Toolkit) part 04 of 14
  4. Reply-To: net@tub.UUCP (Oliver Laumann)
  5.  
  6. Posting-number: Volume 8, Issue 52
  7. Submitted-by: net@tub.UUCP (Oliver Laumann)
  8. Archive-name: elk/part04
  9.  
  10. [Let this be a lesson to submitters:  this was submitted as uuencoded,
  11. compressed files.  I lost the source information while unpacking it; this
  12. is the best approximation I could come up with.  ++bsa]
  13.  
  14. #! /bin/sh
  15. # This is a shell archive.  Remove anything before this line, then unpack
  16. # it by saving it into a file and typing "sh file".  To overwrite existing
  17. # files, type "sh file -c".  You can also feed this as standard input via
  18. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  19. # will see the following message at the end:
  20. #        "End of archive 4 (of 14)."
  21. # Contents:  src/list.c src/proc.c src/char.c src/symbol.c src/macros.h
  22. #   src/prim.c src/stack.s.vax scm
  23. # Wrapped by net@tub on Sun Sep 17 17:32:22 1989
  24. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  25. if test -f src/list.c -a "${1}" != "-c" ; then 
  26.   echo shar: Will not over-write existing file \"src/list.c\"
  27. else
  28. echo shar: Extracting \"src/list.c\" \(6515 characters\)
  29. sed "s/^X//" >src/list.c <<'END_OF_src/list.c'
  30. X/* Lists
  31. X */
  32. X
  33. X#include "scheme.h"
  34. X
  35. XObject P_Cons (car, cdr) Object car, cdr; {
  36. X    register char *p;
  37. X    register f = 0;
  38. X    Object cell;
  39. X    GC_Node2;
  40. X
  41. X    p = Hp;
  42. X    ALIGN(p);
  43. X    if (p + sizeof (struct S_Pair) <= Heap_End) {
  44. X    Hp = p + sizeof (struct S_Pair);
  45. X    } else {
  46. X    GC_Link2 (car, cdr);
  47. X    p = Get_Bytes (sizeof (struct S_Pair));
  48. X    f++;
  49. X    }
  50. X    SET(cell, T_Pair, (struct S_Pair *)p);
  51. X    Car (cell) = car;
  52. X    Cdr (cell) = cdr;
  53. X    if (f)
  54. X    GC_Unlink;
  55. X    return cell;
  56. X}
  57. X
  58. XObject P_Car (x) Object x; {
  59. X    Check_List (x);
  60. X    return Nullp (x) ? Null : Car (x);
  61. X}
  62. X
  63. XObject P_Cdr (x) Object x; {
  64. X    Check_List (x);
  65. X    return Nullp (x) ? Null : Cdr (x);
  66. X}
  67. X
  68. XObject Cxr (x, pat, len) Object x; register char *pat; register len; {
  69. X    Object ret;
  70. X
  71. X    for (ret = x, pat += len; !Nullp (ret) && len > 0; len--)
  72. X    switch (*--pat) {
  73. X    case 'a': ret = P_Car (ret); break;
  74. X    case 'd': ret = P_Cdr (ret); break;
  75. X    default: Primitive_Error ("invalid pattern");
  76. X    }
  77. X    return ret;
  78. X}
  79. X
  80. XObject P_Cddr  (x) Object x; { return Cxr (x,  "dd", 2); }
  81. XObject P_Cdar  (x) Object x; { return Cxr (x,  "da", 2); }
  82. XObject P_Cadr  (x) Object x; { return Cxr (x,  "ad", 2); }
  83. XObject P_Caar  (x) Object x; { return Cxr (x,  "aa", 2); }
  84. XObject P_Cdddr (x) Object x; { return Cxr (x, "ddd", 3); }
  85. XObject P_Cddar (x) Object x; { return Cxr (x, "dda", 3); }
  86. XObject P_Cdadr (x) Object x; { return Cxr (x, "dad", 3); }
  87. XObject P_Cdaar (x) Object x; { return Cxr (x, "daa", 3); }
  88. XObject P_Caddr (x) Object x; { return Cxr (x, "add", 3); }
  89. XObject P_Cadar (x) Object x; { return Cxr (x, "ada", 3); }
  90. XObject P_Caadr (x) Object x; { return Cxr (x, "aad", 3); }
  91. XObject P_Caaar (x) Object x; { return Cxr (x, "aaa", 3); }
  92. X
  93. XObject P_Cxr (x, pat) Object x, pat; {
  94. X    Check_List (x);
  95. X    if (TYPE(pat) == T_Symbol)
  96. X    pat = SYMBOL(pat)->name;
  97. X    else if (TYPE(pat) != T_String)
  98. X    Wrong_Type_Combination (pat, "string or symbol");
  99. X    return Cxr (x, STRING(pat)->data, STRING(pat)->size);
  100. X}
  101. X
  102. XObject P_Nullp (x) Object x; {
  103. X    return Nullp (x) ? True : False;
  104. X}
  105. X
  106. XObject P_Pairp (x) Object x; {
  107. X    return TYPE(x) == T_Pair ? True : False;
  108. X}
  109. X
  110. XObject P_Setcar (x, new) Object x, new; {
  111. X    Check_Type (x, T_Pair);
  112. X    return Car (x) = new;
  113. X}
  114. X
  115. XObject P_Setcdr (x, new) Object x, new; {
  116. X    Check_Type (x, T_Pair);
  117. X    return Cdr (x) = new;
  118. X}
  119. X
  120. XObject General_Member (key, list, comp) Object key, list; register comp; {
  121. X    register r;
  122. X
  123. X    for ( ; !Nullp (list); list = Cdr (list)) {
  124. X    Check_List (list);
  125. X    if (comp == 0)
  126. X        r = EQ(Car (list), key);
  127. X    else if (comp == 1)
  128. X        r = Eqv (Car (list), key);
  129. X    else
  130. X        r = Equal (Car (list), key);
  131. X    if (r) return list;
  132. X    }
  133. X    return False;
  134. X}
  135. X
  136. XObject P_Memq (key, list) Object key, list; {
  137. X    return General_Member (key, list, 0);
  138. X}
  139. X
  140. XObject P_Memv (key, list) Object key, list; {
  141. X    return General_Member (key, list, 1);
  142. X}
  143. X
  144. XObject P_Member (key, list) Object key, list; {
  145. X    return General_Member (key, list, 2);
  146. X}
  147. X
  148. XObject General_Assoc (key, alist, comp) Object key, alist; register comp; {
  149. X    Object elem;
  150. X    register r;
  151. X
  152. X    for ( ; !Nullp (alist); alist = Cdr (alist)) {
  153. X    Check_List (alist);
  154. X    elem = Car (alist);
  155. X    if (TYPE(elem) != T_Pair)
  156. X        continue;
  157. X    if (comp == 0)
  158. X        r = EQ(Car (elem), key);
  159. X    else if (comp == 1)
  160. X        r = Eqv (Car (elem), key);
  161. X    else
  162. X        r = Equal (Car (elem), key);
  163. X    if (r) return elem;
  164. X    }
  165. X    return False;
  166. X}
  167. X
  168. XObject P_Assq (key, alist) Object key, alist; {
  169. X    return General_Assoc (key, alist, 0);
  170. X}
  171. X
  172. XObject P_Assv (key, alist) Object key, alist; {
  173. X    return General_Assoc (key, alist, 1);
  174. X}
  175. X
  176. XObject P_Assoc (key, alist) Object key, alist; {
  177. X    return General_Assoc (key, alist, 2);
  178. X}
  179. X
  180. XInternal_Length (list) Object list; {
  181. X    Object tail;
  182. X    register i;
  183. X
  184. X    for (i = 0, tail = list; TYPE(tail) == T_Pair; tail = Cdr (tail), i++)
  185. X    ;
  186. X    return i;
  187. X}
  188. X
  189. XObject P_Length (list) Object list; {
  190. X    Object tail;
  191. X    register i;
  192. X
  193. X    for (i = 0, tail = list; !Nullp (tail); tail = Cdr (tail), i++)
  194. X    Check_List (tail);
  195. X    return Make_Integer (i);
  196. X}
  197. X
  198. XObject P_Make_List (n, init) Object n, init; {
  199. X    register len;
  200. X    Object list;
  201. X    GC_Node;
  202. X
  203. X    if ((len = Get_Integer (n)) < 0)
  204. X    Range_Error (n);
  205. X    list = Null;
  206. X    GC_Link (init);
  207. X    while (len-- > 0)
  208. X    list = Cons (init, list);
  209. X    GC_Unlink;
  210. X    return list;
  211. X}
  212. X
  213. XObject P_List (argc, argv) Object *argv; {
  214. X    Object list, tail, cell;
  215. X    GC_Node2;
  216. X
  217. X    GC_Link2 (list, tail);
  218. X    for (list = tail = Null; argc-- > 0; tail = cell) {
  219. X    cell = Cons (*argv++, Null);
  220. X    if (Nullp (list))
  221. X        list = cell;
  222. X    else
  223. X        P_Setcdr (tail, cell);
  224. X    }
  225. X    GC_Unlink;
  226. X    return list;
  227. X}
  228. X
  229. XObject P_Last_Pair (x) Object x; {
  230. X    Check_Type (x, T_Pair);
  231. X    for ( ; TYPE(Cdr (x)) == T_Pair; x = Cdr (x)) ;
  232. X    return x;
  233. X}
  234. X
  235. XObject P_Append (argc, argv) Object *argv; {
  236. X    Object list, last, tail, cell;
  237. X    register i;
  238. X    GC_Node3;
  239. X
  240. X    list = last = Null;
  241. X    GC_Link3 (list, last, tail);
  242. X    for (i = 0; i < argc-1; i++) {
  243. X    for (tail = argv[i]; !Nullp (tail); tail = Cdr (tail)) {
  244. X        Check_List (tail);
  245. X        cell = Cons (Car (tail), Null);
  246. X        if (Nullp (list))
  247. X        list = cell;
  248. X        else
  249. X        P_Setcdr (last, cell);
  250. X        last = cell;
  251. X    }
  252. X    }
  253. X    if (argc)
  254. X    if (Nullp (list))
  255. X        list = argv[i];
  256. X    else
  257. X        P_Setcdr (last, argv[i]);
  258. X    GC_Unlink;
  259. X    return list;
  260. X}
  261. X
  262. XObject P_Append_Set (argc, argv) Object *argv; {
  263. X    register i, j;
  264. X
  265. X    for (i = j = 0; i < argc; i++)
  266. X    if (!Nullp (argv[i]))
  267. X        argv[j++] = argv[i];
  268. X    if (j == 0)
  269. X    return Null;
  270. X    for (i = 0; i < j-1; i++)
  271. X    P_Setcdr (P_Last_Pair (argv[i]), argv[i+1]);
  272. X    return *argv;
  273. X}
  274. X
  275. XObject P_Reverse (x) Object x; {
  276. X    Object ret;
  277. X    GC_Node;
  278. X
  279. X    GC_Link (x);
  280. X    for (ret = Null; !Nullp (x); x = Cdr (x)) {
  281. X    Check_List (x);
  282. X    ret = Cons (Car (x), ret);
  283. X    }
  284. X    GC_Unlink;
  285. X    return ret;
  286. X}
  287. X
  288. XObject P_Reverse_Set (x) Object x; {
  289. X    Object prev, tail;
  290. X
  291. X    for (prev = Null; !Nullp (x); prev = x, x = tail) {
  292. X    Check_List (x);
  293. X    tail = Cdr (x);
  294. X    P_Setcdr (x, prev);
  295. X    }
  296. X    return prev;
  297. X}
  298. X
  299. XObject P_List_Tail (x, num) Object x, num; {
  300. X    register n;
  301. X
  302. X    for (n = Get_Integer (num); n > 0 && !Nullp (x); n--, x = P_Cdr (x)) ;
  303. X    return x;
  304. X}
  305. X
  306. XObject P_List_Ref (x, num) Object x, num; {
  307. X    return P_Car (P_List_Tail (x, num));
  308. X}
  309. X
  310. XObject Copy_List (x) Object x; {
  311. X    Object car, cdr;
  312. X    GC_Node3;
  313. X
  314. X    if (TYPE(x) == T_Pair) {
  315. X    if (stksize () > maxstack)
  316. X        Uncatchable_Error ("Out of stack space");
  317. X    car = cdr = Null;
  318. X    GC_Link3 (x, car, cdr);
  319. X    car = Copy_List (Car (x));
  320. X    cdr = Copy_List (Cdr (x));
  321. X    x = Cons (car, cdr);
  322. X    GC_Unlink;
  323. X    }
  324. X    return x;
  325. X}
  326. END_OF_src/list.c
  327. if test 6515 -ne `wc -c <src/list.c`; then
  328.     echo shar: \"src/list.c\" unpacked with wrong size!
  329. fi
  330. # end of overwriting check
  331. fi
  332. if test -f src/proc.c -a "${1}" != "-c" ; then 
  333.   echo shar: Will not over-write existing file \"src/proc.c\"
  334. else
  335. echo shar: Extracting \"src/proc.c\" \(13760 characters\)
  336. sed "s/^X//" >src/proc.c <<'END_OF_src/proc.c'
  337. X/* Eval, apply, etc.
  338. X */
  339. X
  340. X#include "scheme.h"
  341. X
  342. Xchar *Error_Tag;
  343. X
  344. X/* "Tail_Call" indicates whether we are executing the last form in a
  345. X * sequence of forms.  If it is true and we are about to call a compound
  346. X * procedure, we are allowed to check whether a tail-call can be
  347. X * performed instead.
  348. X */
  349. Xint Tail_Call = 0;
  350. X
  351. XObject Sym_Lambda,
  352. X       Sym_Macro;
  353. X
  354. XObject Macro_Expand();
  355. X
  356. XInit_Proc () {
  357. X    Define_Symbol (&Sym_Lambda, "lambda");
  358. X    Define_Symbol (&Sym_Macro, "macro");
  359. X}
  360. X
  361. XCheck_Procedure (x) Object x; {
  362. X    register t = TYPE(x);
  363. X
  364. X    if (t != T_Primitive && t != T_Compound)
  365. X    Wrong_Type_Combination (x, "procedure");
  366. X    if (t == T_Primitive && PRIM(x)->disc == NOEVAL)
  367. X    Primitive_Error ("invalid procedure: ~s", x);
  368. X}
  369. X
  370. XObject P_Procedurep (x) Object x; {
  371. X    register t = TYPE(x);
  372. X    return t == T_Primitive || t == T_Compound || t == T_Control_Point
  373. X     ? True : False;
  374. X}
  375. X
  376. XObject P_Primitivep (x) Object x; {
  377. X    return TYPE(x) == T_Primitive ? True : False;
  378. X}
  379. X
  380. XObject P_Compoundp (x) Object x; {
  381. X    return TYPE(x) == T_Compound ? True : False;
  382. X}
  383. X
  384. XObject P_Macrop (x) Object x; {
  385. X    return TYPE(x) == T_Macro ? True : False;
  386. X}
  387. X
  388. XObject Make_Compound () {
  389. X    Object proc;
  390. X    register char *p;
  391. X
  392. X    p = Get_Bytes (sizeof (struct S_Compound));
  393. X    SET(proc, T_Compound, (struct S_Compound *)p);
  394. X    COMPOUND(proc)->closure = COMPOUND(proc)->env = COMPOUND(proc)->name = Null;
  395. X    return proc;
  396. X}
  397. X
  398. XObject Make_Primitive (fun, name, min, max, disc) Object (*fun)(); char *name;
  399. X    enum discipline disc; {
  400. X    Object prim;
  401. X    register char *p;
  402. X    register struct S_Primitive *pr;
  403. X
  404. X    p = Get_Bytes (sizeof (struct S_Primitive));
  405. X    SET(prim, T_Primitive, (struct S_Primitive *)p);
  406. X    pr = PRIM(prim);
  407. X    pr->tag = Null;
  408. X    pr->fun = fun;
  409. X    pr->name = name;
  410. X    pr->minargs = min;
  411. X    pr->maxargs = max;
  412. X    pr->disc = disc;
  413. X    return prim;
  414. X}
  415. X
  416. XObject P_Begin (forms) Object forms; {
  417. X    GC_Node;
  418. X    TC_Prolog;
  419. X
  420. X    if (Nullp (forms))
  421. X    return Null;
  422. X    GC_Link (forms);
  423. X    TC_Disable;
  424. X    for ( ; !Nullp (Cdr (forms)); forms = Cdr (forms))
  425. X    (void)Eval (Car (forms));
  426. X    GC_Unlink;
  427. X    TC_Enable;
  428. X    return Eval (Car (forms));
  429. X}
  430. X
  431. XObject P_Begin1 (forms) Object forms; {
  432. X    register n;
  433. X    Object r, ret;
  434. X    GC_Node;
  435. X    TC_Prolog;
  436. X
  437. X    GC_Link (forms);
  438. X    TC_Disable;
  439. X    for (n = 1; !Nullp (Cdr (forms)); n = 0, forms = Cdr (forms)) {
  440. X    r = Eval (Car (forms));
  441. X    if (n)
  442. X        ret = r;
  443. X    }
  444. X    GC_Unlink;
  445. X    TC_Enable;
  446. X    r = Eval (Car (forms));
  447. X    return n ? r : ret;
  448. X}
  449. X
  450. XObject Eval (form) Object form; {
  451. X    register t;
  452. X    register struct S_Symbol *sym;
  453. X    Object fun, binding, args, ret;
  454. X    GC_Node;
  455. X
  456. Xagain:
  457. X    t = TYPE(form);
  458. X    if (t == T_Symbol) {
  459. X    sym = SYMBOL(form);
  460. X    if (EQ(sym->value,Unbound)) {
  461. X        binding = Lookup_Symbol (form, 1);
  462. X        sym->value = Cdr (binding);
  463. X    }
  464. X    ret = sym->value;
  465. X    if (TYPE(ret) == T_Autoload)
  466. X        ret = Do_Autoload (form, ret);
  467. X    return ret;
  468. X    }
  469. X    if (t != T_Pair)
  470. X    return form;
  471. X    if (stksize () > maxstack)
  472. X    Uncatchable_Error ("Out of stack space");
  473. X    GC_Link (form);
  474. X    fun = Eval (Car (form));
  475. X    args = Cdr (form);
  476. X    Check_List (args);
  477. X    if (TYPE(fun) == T_Macro) {
  478. X    form = Macro_Expand (fun, args);
  479. X    GC_Unlink;
  480. X    goto again;
  481. X    }
  482. X    ret = Funcall (fun, args, 1);
  483. X    GC_Unlink;
  484. X    return ret;
  485. X}
  486. X
  487. XObject P_Eval (argc, argv) Object *argv; {
  488. X    Object ret, oldenv;
  489. X    GC_Node;
  490. X
  491. X    if (argc == 1)
  492. X    return Eval (argv[0]);
  493. X    Check_Type (argv[1], T_Environment);
  494. X    oldenv = The_Environment;
  495. X    GC_Link (oldenv);
  496. X    Switch_Environment (argv[1]);
  497. X    ret = Eval (argv[0]);
  498. X    Switch_Environment (oldenv);
  499. X    GC_Unlink;
  500. X    return ret;
  501. X}
  502. X
  503. XObject P_Apply (argc, argv) Object *argv; {
  504. X    Object ret, list, tail, cell, last;
  505. X    register i;
  506. X    GC_Node3;
  507. X
  508. X    Check_Procedure (argv[0]);
  509. X    /* Make a list of all args but the last, then append the
  510. X     * last arg (which must be a proper list) to this list.
  511. X     */
  512. X    list = tail = last = Null;
  513. X    GC_Link3 (list, tail, last);
  514. X    for (i = 1; i < argc-1; i++, tail = cell) {
  515. X    cell = Cons (argv[i], Null);
  516. X    if (Nullp (list))
  517. X        list = cell;
  518. X    else
  519. X        P_Setcdr (tail, cell);
  520. X    }
  521. X    for (last = argv[argc-1]; !Nullp (last); last = Cdr (last), tail = cell) {
  522. X    cell = Cons (P_Car (last), Null);
  523. X    if (Nullp (list))
  524. X        list = cell;
  525. X    else
  526. X        P_Setcdr (tail, cell);
  527. X    }
  528. X    ret = Funcall (argv[0], list, 0);
  529. X    GC_Unlink;
  530. X    return ret;
  531. X}
  532. X
  533. XArglist_Length (list) Object list; {
  534. X    Object tail;
  535. X    register i;
  536. X
  537. X    for (i = 0, tail = list; TYPE(tail) == T_Pair; tail = Cdr (tail), i++)
  538. X    ;
  539. X    if (Nullp (tail))
  540. X    return i;
  541. X    Primitive_Error ("argument list is improper");
  542. X    /*NOTREACHED*/
  543. X}
  544. X
  545. XObject Funcall_Primitive (fun, argl, eval) Object fun, argl; {
  546. X    register struct S_Primitive *prim;
  547. X    register argc, i;
  548. X    char *last;
  549. X    register Object *argv;
  550. X    Object abuf[8], ret;
  551. X    GC_Node2; GCNODE gcv;
  552. X    TC_Prolog;
  553. X
  554. X    prim = PRIM(fun);
  555. X    last = Error_Tag;
  556. X    Error_Tag = prim->name;
  557. X    argc = Arglist_Length (argl);
  558. X    if (argc < prim->minargs
  559. X        || (prim->maxargs != MANY && argc > prim->maxargs))
  560. X    Primitive_Error ("wrong number of arguments");
  561. X    if (prim->disc == NOEVAL) {
  562. X    ret = (prim->fun)(argl);
  563. X    } else {
  564. X    /* Tail recursion is not possible while evaluating the arguments
  565. X     * of a primitive procedure.
  566. X     */
  567. X    TC_Disable;
  568. X    if (argc <= 8)
  569. X        argv = abuf;
  570. X    else
  571. X        argv = (Object *)alloca (argc * sizeof (Object));
  572. X    GC_Link2 (argl, fun);
  573. X    gcv.gclen = 1; gcv.gcobj = argv; gcv.next = &gc2; GC_List = &gcv;
  574. X    for (i = 0; i < argc; i++, argl = Cdr (argl)) {
  575. X        argv[i] = eval ? Eval (Car (argl)) : Car (argl);
  576. X        gcv.gclen++;
  577. X    }
  578. X    TC_Enable;
  579. X    prim = PRIM(fun);   /* fun has possibly been moved during gc */
  580. X    if (prim->disc == VARARGS) {
  581. X        ret = (prim->fun)(argc, argv);
  582. X    } else {
  583. X        switch (argc) {
  584. X        case 0:
  585. X        ret = (prim->fun)(); break;
  586. X        case 1:
  587. X        ret = (prim->fun)(argv[0]); break;
  588. X        case 2:
  589. X        ret = (prim->fun)(argv[0], argv[1]); break;
  590. X        case 3:
  591. X        ret = (prim->fun)(argv[0], argv[1], argv[2]); break;
  592. X        case 4:
  593. X        ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3]); break;
  594. X        case 5:
  595. X        ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4]);
  596. X        break;
  597. X        case 6:
  598. X        ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4],
  599. X                          argv[5]); break;
  600. X        case 7:
  601. X        ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4],
  602. X                          argv[5], argv[6]); break;
  603. X        case 8:
  604. X        ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4],
  605. X                          argv[5], argv[6], argv[7]); break;
  606. X        case 9:
  607. X        ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4],
  608. X                          argv[5], argv[6], argv[7], argv[8]); break;
  609. X        case 10:
  610. X        ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4],
  611. X                          argv[5], argv[6], argv[7], argv[8], argv[9]);
  612. X        break;
  613. X        default:
  614. X        Panic ("too many args for primitive");
  615. X        }
  616. X    }
  617. X    GC_Unlink;
  618. X    }
  619. X    Error_Tag = last;
  620. X    return ret;
  621. X}
  622. X
  623. X/* If we are in a tail recursion, we are reusing the old procedure
  624. X * frame; we just assign new values to the formal parameters:
  625. X */
  626. X#define Lambda_Bind(var,val)\
  627. Xif (tail_calling) {\
  628. X    frame = Lookup_Symbol (var, 1);\
  629. X    Cdr (frame) = val;\
  630. X    SYMBOL(var)->value = val;\
  631. X} else {\
  632. X    frame = Add_Binding (frame, var, val);\
  633. X}
  634. X
  635. XObject Funcall_Compound (fun, argl, eval) Object fun, argl; {
  636. X    register argc, i, tail_calling = 0;
  637. X    Object oldenv;
  638. X    Object *argv, abuf[4], rest, ret, frame, tail, tail_call_env;
  639. X    GC_Node5; GCNODE gcv;
  640. X    TC_Prolog;
  641. X
  642. X#ifdef lint
  643. X    tail_call_env = Null;
  644. X#endif
  645. X    frame = oldenv = tail = Null;
  646. X    GC_Link5 (argl, oldenv, frame, tail, fun);
  647. Xagain:
  648. X    argc = Arglist_Length (argl);
  649. X    if (tail_calling) {
  650. X    tail = The_Environment;
  651. X    Switch_Environment (tail_call_env);
  652. X    } else {
  653. X    if (argc <= 4)
  654. X        argv = abuf;
  655. X    else
  656. X        argv = (Object *)alloca (argc * sizeof (Object));
  657. X    }
  658. X    TC_Disable;
  659. X    gcv.gclen = 1; gcv.gcobj = argv; gcv.next = &gc5; GC_List = &gcv;
  660. X    for (i = 0; i < argc; i++, argl = Cdr (argl)) {
  661. X    argv[i] = eval ? Eval (Car (argl)) : Car (argl);
  662. X    gcv.gclen++;
  663. X    }
  664. X    TC_Enable;
  665. X    if (tail_calling)
  666. X    Switch_Environment (tail);
  667. X    tail = Car (Cdr (COMPOUND(fun)->closure));
  668. X    if (TYPE(tail) == T_Symbol) {
  669. X    rest = P_List (argc, argv);
  670. X    Lambda_Bind (tail, rest);
  671. X    } else {
  672. X    for (i = 0; TYPE(tail) == T_Pair; tail = Cdr (tail), i++) {
  673. X        Check_Type (Car (tail), T_Symbol);
  674. X        if (i == argc)
  675. X        Primitive_Error ("too few arguments for ~s", fun);
  676. X        Lambda_Bind (Car (tail), argv[i]);
  677. X    }
  678. X    if (Nullp (tail)) {
  679. X        if (i < argc)
  680. X        Primitive_Error ("too many arguments for ~s", fun);
  681. X    } else {
  682. X        Check_Type (tail, T_Symbol);
  683. X        rest = P_List (argc-i, argv+i);
  684. X        Lambda_Bind (tail, rest);
  685. X    }
  686. X    }
  687. X    if (!tail_calling) {
  688. X    oldenv = The_Environment;
  689. X    Switch_Environment (COMPOUND(fun)->env);
  690. X    Push_Frame (frame);
  691. X    }
  692. X    Tail_Call = 1;
  693. X    ret = Begin (Cdr (Cdr (COMPOUND(fun)->closure)));
  694. X    if (TYPE(ret) == T_Special) {
  695. X    argl = Car (ret);
  696. X    tail_call_env = Cdr (ret);
  697. X    tail_calling = 1;
  698. X    eval = 1;
  699. X    goto again;
  700. X    }
  701. X    Tail_Call = 0;
  702. X    Pop_Frame ();
  703. X    Switch_Environment (oldenv);
  704. X    GC_Unlink;
  705. X    return ret;
  706. X}
  707. X
  708. XObject Funcall (fun, argl, eval) Object fun, argl; {
  709. X    register t;
  710. X    static struct S_Pair tail_call_info;
  711. X    Object ret, env;
  712. X    Tag_Node;
  713. X
  714. X    t = TYPE(fun);
  715. X    if (Tail_Call && eval && t == T_Compound) {
  716. X    register GCNODE *p;
  717. X    Object f;
  718. X
  719. X    for (p = GC_List; p; p = p->next) {
  720. X        f = *(p->gcobj);
  721. X        if (p->gclen == TAG_FUN && TYPE(f) == T_Compound) {
  722. X        if (EQ(f,fun)) {
  723. X            SET(ret, T_Special, &tail_call_info);
  724. X            Car (ret) = argl;
  725. X            Cdr (ret) = The_Environment;
  726. X            return ret;
  727. X        }
  728. X        break;
  729. X        }
  730. X    }
  731. X    }
  732. X    env = The_Environment;
  733. X    Tag_Link (argl, fun, env);
  734. X    if (t == T_Primitive) {
  735. X    ret = Funcall_Primitive (fun, argl, eval);
  736. X    } else if (t == T_Compound) {
  737. X    ret = Funcall_Compound (fun, argl, eval);
  738. X    } else if (t == T_Control_Point) {
  739. X    Funcall_Control_Point (fun, argl, eval);
  740. X    /*NOTREACHED*/
  741. X    } else Primitive_Error ("application of non-procedure (~s)", fun);
  742. X    GC_Unlink;
  743. X    return ret;
  744. X}
  745. X
  746. XObject P_Lambda (argl) Object argl; {
  747. X    Object proc, args, closure;
  748. X    GC_Node2;
  749. X
  750. X    proc = Null;
  751. X    args = Car (argl);
  752. X    if (TYPE(args) != T_Symbol && TYPE(args) != T_Pair && !Nullp (args))
  753. X    Wrong_Type_Combination (args, "list or symbol");
  754. X    GC_Link2 (argl, proc);
  755. X    proc = Make_Compound ();
  756. X    closure = Cons (Sym_Lambda, argl);
  757. X    COMPOUND(proc)->closure = closure;
  758. X    COMPOUND(proc)->env = The_Environment;
  759. X    GC_Unlink;
  760. X    return proc;
  761. X}
  762. X
  763. XObject P_Procedure_Lambda (p) Object p; {
  764. X    Check_Type (p, T_Compound);
  765. X    return Copy_List (COMPOUND(p)->closure);
  766. X}
  767. X
  768. XObject P_Procedure_Env (p) Object p; {
  769. X    Check_Type (p, T_Compound);
  770. X    return COMPOUND(p)->env;
  771. X}
  772. X
  773. XObject General_Map (argc, argv, accum) Object *argv; register accum; {
  774. X    register i;
  775. X    Object *args;
  776. X    Object head, list, tail, cell, arglist, val;
  777. X    GC_Node2; GCNODE gcv;
  778. X
  779. X    Check_Procedure (argv[0]);
  780. X    args = (Object *)alloca ((argc-1) * sizeof (Object));
  781. X    list = tail = Null;
  782. X    GC_Link2 (list, tail);
  783. X    gcv.gclen = argc; gcv.gcobj = args; gcv.next = &gc2; GC_List = &gcv;
  784. X    while (1) {
  785. X    for (i = 1; i < argc; i++) {
  786. X        head = argv[i];
  787. X        if (Nullp (head)) {
  788. X        GC_Unlink;
  789. X        return list;
  790. X        }
  791. X        Check_Type (head, T_Pair);
  792. X        args[i-1] = Car (head);
  793. X        argv[i] = Cdr (head);
  794. X    }
  795. X    arglist = P_List (argc-1, args);
  796. X    val = Funcall (argv[0], arglist, 0);
  797. X    if (!accum)
  798. X        continue;
  799. X    cell = Cons (val, Null);
  800. X    if (Nullp (list))
  801. X        list = cell;
  802. X    else
  803. X        P_Setcdr (tail, cell);
  804. X    tail = cell;
  805. X    }
  806. X    /*NOTREACHED*/
  807. X}
  808. X
  809. XObject P_Map (argc, argv) Object *argv; {
  810. X    return General_Map (argc, argv, 1);
  811. X}
  812. X
  813. XObject P_For_Each (argc, argv) Object *argv; {
  814. X    return General_Map (argc, argv, 0);
  815. X}
  816. X
  817. XObject Make_Macro () {
  818. X    Object mac;
  819. X    register char *p;
  820. X
  821. X    p = Get_Bytes (sizeof (struct S_Macro));
  822. X    SET(mac, T_Macro, (struct S_Macro *)p);
  823. X    MACRO(mac)->body = MACRO(mac)->name = Null;
  824. X    return mac;
  825. X}
  826. X
  827. XObject P_Macro (argl) Object argl; {
  828. X    Object mac, args, body;
  829. X    GC_Node2;
  830. X
  831. X    mac = Null;
  832. X    args = Car (argl);
  833. X    if (TYPE(args) != T_Symbol && TYPE(args) != T_Pair && !Nullp (args))
  834. X    Wrong_Type_Combination (args, "list or symbol");
  835. X    GC_Link2 (argl, mac);
  836. X    mac = Make_Macro ();
  837. X    body = Cons (Sym_Macro, argl);
  838. X    MACRO(mac)->body = body;
  839. X    GC_Unlink;
  840. X    return mac;
  841. X}
  842. X
  843. XObject P_Macro_Body (m) Object m; {
  844. X    Check_Type (m, T_Macro);
  845. X    return Copy_List (MACRO(m)->body);
  846. X}
  847. X
  848. XObject Macro_Expand (mac, argl) Object mac, argl; {
  849. X    register argc, i, tail_calling = 0;
  850. X    Object frame, ret, tail;
  851. X    GC_Node4;
  852. X    TC_Prolog;
  853. X
  854. X    frame = tail = Null;
  855. X    GC_Link4 (argl, frame, tail, mac);
  856. X    argc = Arglist_Length (argl);
  857. X    tail = Car (Cdr (MACRO(mac)->body));
  858. X    if (TYPE(tail) == T_Symbol) {
  859. X    Lambda_Bind (tail, argl);
  860. X    } else {
  861. X    for (i = 0; TYPE(tail) == T_Pair; tail = Cdr (tail), i++) {
  862. X        Check_Type (Car (tail), T_Symbol);
  863. X        if (i == argc)
  864. X        Primitive_Error ("too few arguments for ~s", mac);
  865. X        Lambda_Bind (Car (tail), Car (argl));
  866. X        argl = Cdr (argl);
  867. X    }
  868. X    if (Nullp (tail)) {
  869. X        if (i < argc)
  870. X        Primitive_Error ("too many arguments for ~s", mac);
  871. X    } else {
  872. X        Check_Type (tail, T_Symbol);
  873. X        Lambda_Bind (tail, argl);
  874. X    }
  875. X    }
  876. X    Push_Frame (frame);
  877. X    TC_Disable;
  878. X    ret = Begin (Cdr (Cdr (MACRO(mac)->body)));
  879. X    TC_Enable;
  880. X    Pop_Frame ();
  881. X    GC_Unlink;
  882. X    return ret;
  883. X}
  884. X
  885. XObject P_Macro_Expand (form) Object form; {
  886. X    Object ret, mac;
  887. X    GC_Node;
  888. X
  889. X    Check_Type (form, T_Pair);
  890. X    GC_Link (form);
  891. X    mac = Eval (Car (form));
  892. X    if (TYPE(mac) != T_Macro)
  893. X    ret = form;
  894. X    else
  895. X    ret = Macro_Expand (mac, Cdr (form));
  896. X    GC_Unlink;
  897. X    return ret;
  898. X}
  899. END_OF_src/proc.c
  900. if test 13760 -ne `wc -c <src/proc.c`; then
  901.     echo shar: \"src/proc.c\" unpacked with wrong size!
  902. fi
  903. # end of overwriting check
  904. fi
  905. if test -f src/char.c -a "${1}" != "-c" ; then 
  906.   echo shar: Will not over-write existing file \"src/char.c\"
  907. else
  908. echo shar: Extracting \"src/char.c\" \(2740 characters\)
  909. sed "s/^X//" >src/char.c <<'END_OF_src/char.c'
  910. X/* Characters
  911. X */
  912. X
  913. X#include <ctype.h>
  914. X
  915. X#include "scheme.h"
  916. X
  917. XObject Make_Char (c) register c; {
  918. X    Object ch;
  919. X
  920. X    SET(ch, T_Character, (unsigned char)c);
  921. X    return ch;
  922. X}
  923. X
  924. XObject P_Charp (c) Object c; {
  925. X    return TYPE(c) == T_Character ? True : False;
  926. X}
  927. X
  928. XObject P_Char_To_Integer (c) Object c; {
  929. X    Check_Type (c, T_Character);
  930. X    return Make_Integer (CHAR(c));
  931. X}
  932. X
  933. XObject P_Integer_To_Char (n) Object n; {
  934. X    register i;
  935. X
  936. X    if ((i = Get_Integer (n)) < 0 || i > 255)
  937. X    Range_Error (n);
  938. X    return Make_Char (i);
  939. X}
  940. X
  941. XObject P_Char_Upper_Case (c) Object c; {
  942. X    Check_Type (c, T_Character);
  943. X    return isupper (CHAR(c)) ? True : False;
  944. X}
  945. X
  946. XObject P_Char_Lower_Case (c) Object c; {
  947. X    Check_Type (c, T_Character);
  948. X    return islower (CHAR(c)) ? True : False;
  949. X}
  950. X
  951. XObject P_Char_Alphabetic (c) Object c; {
  952. X    Check_Type (c, T_Character);
  953. X    return isalpha (CHAR(c)) ? True : False;
  954. X}
  955. X
  956. XObject P_Char_Numeric (c) Object c; {
  957. X    Check_Type (c, T_Character);
  958. X    return isdigit (CHAR(c)) ? True : False;
  959. X}
  960. X
  961. XObject P_Char_Whitespace (c) Object c; {
  962. X    register x;
  963. X
  964. X    Check_Type (c, T_Character);
  965. X    x = CHAR(c);
  966. X    return Whitespace (x) ? True : False;
  967. X}
  968. X
  969. XObject P_Char_Upcase (c) Object c; {
  970. X    Check_Type (c, T_Character);
  971. X    return islower (CHAR(c)) ? Make_Char (toupper (CHAR(c))) : c;
  972. X}
  973. X
  974. XObject P_Char_Downcase (c) Object c; {
  975. X    Check_Type (c, T_Character);
  976. X    return isupper (CHAR(c)) ? Make_Char (tolower (CHAR(c))) : c;
  977. X}
  978. X
  979. XGeneral_Chrcmp (c1, c2, ci) Object c1, c2; register ci; {
  980. X    Check_Type (c1, T_Character);
  981. X    Check_Type (c2, T_Character);
  982. X    if (ci)
  983. X    return Char_Map[CHAR(c1)] - Char_Map[CHAR(c2)];
  984. X    return CHAR(c1) - CHAR(c2);
  985. X}
  986. X
  987. XObject P_Chr_Eq (c1, c2) Object c1, c2; {
  988. X    return General_Chrcmp (c1, c2, 0) ? False : True;
  989. X}
  990. X
  991. XObject P_Chr_Less (c1, c2) Object c1, c2; {
  992. X    return General_Chrcmp (c1, c2, 0) < 0 ? True : False;
  993. X}
  994. X
  995. XObject P_Chr_Greater (c1, c2) Object c1, c2; {
  996. X    return General_Chrcmp (c1, c2, 0) > 0 ? True : False;
  997. X}
  998. X
  999. XObject P_Chr_Eq_Less (c1, c2) Object c1, c2; {
  1000. X    return General_Chrcmp (c1, c2, 0) <= 0 ? True : False;
  1001. X}
  1002. X
  1003. XObject P_Chr_Eq_Greater (c1, c2) Object c1, c2; {
  1004. X    return General_Chrcmp (c1, c2, 0) >= 0 ? True : False;
  1005. X}
  1006. X
  1007. XObject P_Chr_CI_Eq (c1, c2) Object c1, c2; {
  1008. X    return General_Chrcmp (c1, c2, 1) ? False : True;
  1009. X}
  1010. X
  1011. XObject P_Chr_CI_Less (c1, c2) Object c1, c2; {
  1012. X    return General_Chrcmp (c1, c2, 1) < 0 ? True : False;
  1013. X}
  1014. X
  1015. XObject P_Chr_CI_Greater (c1, c2) Object c1, c2; {
  1016. X    return General_Chrcmp (c1, c2, 1) > 0 ? True : False;
  1017. X}
  1018. X
  1019. XObject P_Chr_CI_Eq_Less (c1, c2) Object c1, c2; {
  1020. X    return General_Chrcmp (c1, c2, 1) <= 0 ? True : False;
  1021. X}
  1022. X
  1023. XObject P_Chr_CI_Eq_Greater (c1, c2) Object c1, c2; {
  1024. X    return General_Chrcmp (c1, c2, 1) >= 0 ? True : False;
  1025. X}
  1026. END_OF_src/char.c
  1027. if test 2740 -ne `wc -c <src/char.c`; then
  1028.     echo shar: \"src/char.c\" unpacked with wrong size!
  1029. fi
  1030. # end of overwriting check
  1031. fi
  1032. if test -f src/symbol.c -a "${1}" != "-c" ; then 
  1033.   echo shar: Will not over-write existing file \"src/symbol.c\"
  1034. else
  1035. echo shar: Extracting \"src/symbol.c\" \(4650 characters\)
  1036. sed "s/^X//" >src/symbol.c <<'END_OF_src/symbol.c'
  1037. X/* Symbol handling and the obarray
  1038. X */
  1039. X
  1040. X#include "scheme.h"
  1041. X
  1042. XObject Obarray;
  1043. X
  1044. XObject Null,
  1045. X       True,
  1046. X       False,
  1047. X       Unbound,
  1048. X       Special,
  1049. X       Void,
  1050. X       Newline,
  1051. X       Eof,
  1052. X       Zero,
  1053. X       One;
  1054. X
  1055. XInit_Symbol () {
  1056. X    SETTYPE(Null, T_Null);
  1057. X    SETTYPE(True, T_Boolean); SETFIXNUM(True, 1);
  1058. X    SETTYPE(False, T_Boolean); SETFIXNUM(False, 0);
  1059. X    SETTYPE(Unbound, T_Unbound);
  1060. X    SETTYPE(Special, T_Special);
  1061. X    SETTYPE(Void, T_Void);
  1062. X    SETTYPE(Eof, T_End_Of_File);
  1063. X    Newline = Make_Char ('\n');
  1064. X    Zero = Make_Fixnum (0);
  1065. X    One = Make_Fixnum (1);
  1066. X    Obarray = Make_Vector (OBARRAY_SIZE, Null);
  1067. X    Global_GC_Link (Obarray);
  1068. X}
  1069. X
  1070. XObject Make_Symbol (name) Object name; {
  1071. X    Object sym;
  1072. X    register char *p;
  1073. X    register struct S_Symbol *sp;
  1074. X    GC_Node;
  1075. X
  1076. X    GC_Link (name);
  1077. X    p = Get_Bytes (sizeof (struct S_Symbol));
  1078. X    SET(sym, T_Symbol, (struct S_Symbol *)p);
  1079. X    sp = SYMBOL(sym);
  1080. X    sp->name = name;
  1081. X    sp->value = Unbound;
  1082. X    sp->plist = Null;
  1083. X    GC_Unlink;
  1084. X    return sym;
  1085. X}
  1086. X
  1087. XObject P_Symbolp (x) Object x; {
  1088. X    return TYPE(x) == T_Symbol ? True : False;
  1089. X}
  1090. X
  1091. XObject P_Symbol_To_String (x) Object x; {
  1092. X    Check_Type (x, T_Symbol);
  1093. X    return SYMBOL(x)->name;
  1094. X}
  1095. X
  1096. XObject Obarray_Lookup (str, len) register char *str; register len; {
  1097. X    register h;
  1098. X    register struct S_String *s;
  1099. X    register struct S_Symbol *sym;
  1100. X    Object p;
  1101. X
  1102. X    h = Hash (str, len) % OBARRAY_SIZE;
  1103. X    for (p = VECTOR(Obarray)->data[h]; !Nullp (p); p = sym->next) {
  1104. X    sym = SYMBOL(p);
  1105. X    s = STRING(sym->name);
  1106. X    if (s->size == len && bcmp (s->data, str, len) == 0)
  1107. X        return p;
  1108. X    }
  1109. X    return Make_Fixnum (h);
  1110. X}
  1111. X
  1112. XObject Intern (str) char *str; {
  1113. X    Object s, *p, sym, ostr;
  1114. X    register len;
  1115. X
  1116. X    len = strlen (str);
  1117. X    s = Obarray_Lookup (str, len);
  1118. X    if (TYPE(s) != T_Fixnum)
  1119. X    return s;
  1120. X    ostr = Make_String (str, len);
  1121. X    sym = Make_Symbol (ostr);
  1122. X    p = &VECTOR(Obarray)->data[FIXNUM(s)];
  1123. X    SYMBOL(sym)->next = (TYPE(*p) == T_Fixnum) ? Null : *p;
  1124. X    *p = sym;
  1125. X    return sym;
  1126. X}
  1127. X
  1128. XObject P_String_To_Symbol (str) Object str; {
  1129. X    Object s, *p, sym;
  1130. X
  1131. X    Check_Type (str, T_String);
  1132. X    s = Obarray_Lookup (STRING(str)->data, STRING(str)->size);
  1133. X    if (TYPE(s) != T_Fixnum)
  1134. X    return s;
  1135. X    sym = Make_Symbol (str);
  1136. X    p = &VECTOR(Obarray)->data[FIXNUM(s)];
  1137. X    SYMBOL(sym)->next = (TYPE(*p) == T_Fixnum) ? Null : *p;
  1138. X    return *p = sym;
  1139. X}
  1140. X
  1141. XObject P_Oblist () {
  1142. X    register i;
  1143. X    Object p, list, bucket;
  1144. X    GC_Node2;
  1145. X
  1146. X    p = list = Null;
  1147. X    GC_Link2 (p, list);
  1148. X    for (i = 0; i < OBARRAY_SIZE; i++) {
  1149. X    bucket = Null;
  1150. X    for (p = VECTOR(Obarray)->data[i]; !Nullp (p); p = SYMBOL(p)->next)
  1151. X        bucket = Cons (p, bucket);
  1152. X    if (!Nullp (bucket))
  1153. X        list = Cons (bucket, list);
  1154. X    }
  1155. X    GC_Unlink;
  1156. X    return list;
  1157. X}
  1158. X
  1159. XObject P_Put (argc, argv) Object *argv; {
  1160. X    Object sym, key, last, tail, prop;
  1161. X    GC_Node3;
  1162. X
  1163. X    sym = argv[0];
  1164. X    key = argv[1];
  1165. X    Check_Type (sym, T_Symbol);
  1166. X    Check_Type (key, T_Symbol);
  1167. X    last = Null;
  1168. X    for (tail = SYMBOL(sym)->plist; !Nullp (tail); tail = Cdr (tail)) {
  1169. X    prop = Car (tail);
  1170. X    if (EQ(Car (prop), key)) {
  1171. X        if (argc == 3)
  1172. X        Cdr (prop) = argv[2];
  1173. X        else if (Nullp (last))
  1174. X        SYMBOL(sym)->plist = Cdr (tail);
  1175. X        else
  1176. X        Cdr (last) = Cdr (tail);
  1177. X        return key;
  1178. X    }
  1179. X    last = tail;
  1180. X    }
  1181. X    if (argc == 2)
  1182. X    return False;
  1183. X    GC_Link3 (sym, last, key);
  1184. X    tail = Cons (key, argv[2]);
  1185. X    tail = Cons (tail, Null);
  1186. X    if (Nullp (last))
  1187. X    SYMBOL(sym)->plist = tail;
  1188. X    else
  1189. X    Cdr (last) = tail;
  1190. X    GC_Unlink;
  1191. X    return key;
  1192. X}
  1193. X
  1194. XObject P_Get (sym, key) Object sym, key; {
  1195. X    Object prop;
  1196. X
  1197. X    Check_Type (sym, T_Symbol);
  1198. X    Check_Type (key, T_Symbol);
  1199. X    prop = Assq (key, SYMBOL(sym)->plist);
  1200. X    if (!Truep (prop))
  1201. X    return False;
  1202. X    /*
  1203. X     * Do we want to signal an error or return #f?
  1204. X     *
  1205. X     * Primitive_Error ("~s has no such property: ~s", sym, key);
  1206. X     */
  1207. X    return Cdr (prop);
  1208. X}
  1209. X
  1210. XObject P_Symbol_Plist (sym) Object sym; {
  1211. X    Check_Type (sym, T_Symbol);
  1212. X    return Copy_List (SYMBOL(sym)->plist);
  1213. X}
  1214. X
  1215. XHash (str, len) char *str; {
  1216. X    register h;
  1217. X    register char *p, *ep;
  1218. X
  1219. X    h = 5 * len;
  1220. X    if (len > 5)
  1221. X    len = 5;
  1222. X    for (p = str, ep = p+len; p < ep; ++p)
  1223. X    h = (h << 2) ^ *p;
  1224. X    return h & 017777777777;
  1225. X}
  1226. X
  1227. XDefine_Symbol (sym, name) Object *sym; char *name; {
  1228. X    *sym = Intern (name);
  1229. X    _Global_GC_Link (sym);
  1230. X}
  1231. X
  1232. XDefine_Variable (var, name, init) Object *var, init; char *name; {
  1233. X    Object frame, sym;
  1234. X    GC_Node;
  1235. X
  1236. X    GC_Link (init);
  1237. X    sym = Intern (name);
  1238. X    SYMBOL(sym)->value = init;
  1239. X    frame = Add_Binding (Car (The_Environment), sym, init);
  1240. X    *var = Car (frame);
  1241. X    Car (The_Environment) = frame;
  1242. X    _Global_GC_Link (var);
  1243. X    GC_Unlink;
  1244. X}
  1245. END_OF_src/symbol.c
  1246. if test 4650 -ne `wc -c <src/symbol.c`; then
  1247.     echo shar: \"src/symbol.c\" unpacked with wrong size!
  1248. fi
  1249. # end of overwriting check
  1250. fi
  1251. if test -f src/macros.h -a "${1}" != "-c" ; then 
  1252.   echo shar: Will not over-write existing file \"src/macros.h\"
  1253. else
  1254. echo shar: Extracting \"src/macros.h\" \(3835 characters\)
  1255. sed "s/^X//" >src/macros.h <<'END_OF_src/macros.h'
  1256. X#ifndef MACROS_H
  1257. X#define MACROS_H
  1258. X
  1259. X/* Miscellaneous #define's
  1260. X */
  1261. X
  1262. X#ifndef sigmask
  1263. X#define sigmask(n)  (1 << ((n)-1))
  1264. X#endif
  1265. X
  1266. X#define Nullp(x)    ((TYPE(x) == T_Null))
  1267. X#define Truep(x)    (!EQ(x,False) && !Nullp(x))
  1268. X#define Car(x)      PAIR(x)->car
  1269. X#define Cdr(x)      PAIR(x)->cdr
  1270. X#define Val(x)      Cdr(x)
  1271. X#define Cons        P_Cons
  1272. X#define Begin       P_Begin
  1273. X#define Assq(x,y)   General_Assoc(x,y,0)
  1274. X#define Print(x)    General_Print_Object (x, Curr_Output_Port, 0)
  1275. X#define Numeric(t)  (t == T_Fixnum || t == T_Flonum || t == T_Bignum)
  1276. X
  1277. X#define Whitespace(c) (c == ' ' || c == '\t' || c == '\014' || c == '\n')
  1278. X#define Delimiter(c) (c == ';' || c == ')' || c == '(' || c == '#')
  1279. X
  1280. X#ifdef USE_SIGNAL
  1281. X#  define Disable_Interrupts (void)signal (SIGINT, SIG_IGN);
  1282. X#  define Enable_Interrupts  (void)signal (SIGINT, Intr_Handler)
  1283. X#else
  1284. X#  define Disable_Interrupts (void)sigblock (sigmask (SIGINT))
  1285. X#  define Enable_Interrupts  (void)sigsetmask (0)
  1286. X#endif
  1287. X
  1288. X/* Align heap addresses */
  1289. X#define ALIGN(ptr) ((ptr) = (char *)(((int)(ptr) + 3) & ~3))
  1290. X
  1291. X/* Normalize stack addresses */
  1292. X#define NORM(addr)  ((int)(addr) + delta)
  1293. X
  1294. X/* Used in special forms: */
  1295. X#define TC_Prolog   register _t = Tail_Call
  1296. X#define TC_Disable  Tail_Call = 0
  1297. X#define TC_Enable   Tail_Call = _t
  1298. X
  1299. X#define TAG_FUN    -1
  1300. X#define TAG_ARGS   -2
  1301. X#define TAG_ENV    -3
  1302. X
  1303. X#define GC_Node     GCNODE gc1
  1304. X#define GC_Node2    GCNODE gc1, gc2
  1305. X#define GC_Node3    GCNODE gc1, gc2, gc3
  1306. X#define GC_Node4    GCNODE gc1, gc2, gc3, gc4
  1307. X#define GC_Node5    GCNODE gc1, gc2, gc3, gc4, gc5
  1308. X#define GC_Node6    GCNODE gc1, gc2, gc3, gc4, gc5, gc6
  1309. X
  1310. X#define Tag_Node    GC_Node3
  1311. X
  1312. X#define Tag_Link(args,fun,env) {\
  1313. X    gc1.gclen = TAG_ARGS; gc1.gcobj = &args; gc1.next = GC_List;\
  1314. X    gc2.gclen = TAG_FUN;  gc2.gcobj = &fun;  gc2.next = &gc1;\
  1315. X    gc3.gclen = TAG_ENV;  gc3.gcobj = &env;  gc3.next = &gc2; GC_List = &gc3;\
  1316. X}
  1317. X
  1318. X#define GC_Link(x) {\
  1319. X    gc1.gclen = 0; gc1.gcobj = &x; gc1.next = GC_List; GC_List = &gc1;\
  1320. X}
  1321. X
  1322. X#define GC_Link2(x1,x2) {\
  1323. X    gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
  1324. X    gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1; GC_List = &gc2;\
  1325. X}
  1326. X
  1327. X#define GC_Link3(x1,x2,x3) {\
  1328. X    gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
  1329. X    gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
  1330. X    gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2; GC_List = &gc3;\
  1331. X}
  1332. X
  1333. X#define GC_Link4(x1,x2,x3,x4) {\
  1334. X    gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
  1335. X    gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
  1336. X    gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2;\
  1337. X    gc4.gclen = 0; gc4.gcobj = &x4; gc4.next = &gc3; GC_List = &gc4;\
  1338. X}
  1339. X
  1340. X#define GC_Link5(x1,x2,x3,x4,x5) {\
  1341. X    gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
  1342. X    gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
  1343. X    gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2;\
  1344. X    gc4.gclen = 0; gc4.gcobj = &x4; gc4.next = &gc3;\
  1345. X    gc5.gclen = 0; gc5.gcobj = &x5; gc5.next = &gc4; GC_List = &gc5;\
  1346. X}
  1347. X
  1348. X#define GC_Link6(x1,x2,x3,x4,x5,x6) {\
  1349. X    gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
  1350. X    gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
  1351. X    gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2;\
  1352. X    gc4.gclen = 0; gc4.gcobj = &x4; gc4.next = &gc3;\
  1353. X    gc5.gclen = 0; gc5.gcobj = &x5; gc5.next = &gc4;\
  1354. X    gc6.gclen = 0; gc6.gcobj = &x6; gc6.next = &gc5; GC_List = &gc6;\
  1355. X}
  1356. X
  1357. X#define GC_Unlink (GC_List = gc1.next)
  1358. X
  1359. X#define Global_GC_Link(x) _Global_GC_Link(&x)
  1360. X
  1361. X
  1362. X#define Check_Type(x,t) {\
  1363. X    if (TYPE(x) != t) Wrong_Type (x, t);\
  1364. X}
  1365. X
  1366. X#define Check_List(x) {\
  1367. X    if (TYPE(x) != T_Pair && !Nullp (x)) Wrong_Type_Combination (x, "list");\
  1368. X}
  1369. X
  1370. X#define Check_Number(x) {\
  1371. X    register t = TYPE(x);\
  1372. X    if (!Numeric (t)) Wrong_Type_Combination (x, "number");\
  1373. X}
  1374. X
  1375. X#define Check_Integer(x) {\
  1376. X    register t = TYPE(x);\
  1377. X    if (t != T_Fixnum && t != T_Bignum) Wrong_Type (x, T_Fixnum);\
  1378. X}
  1379. X
  1380. X#endif
  1381. END_OF_src/macros.h
  1382. if test 3835 -ne `wc -c <src/macros.h`; then
  1383.     echo shar: \"src/macros.h\" unpacked with wrong size!
  1384. fi
  1385. # end of overwriting check
  1386. fi
  1387. if test -f src/prim.c -a "${1}" != "-c" ; then 
  1388.   echo shar: Will not over-write existing file \"src/prim.c\"
  1389. else
  1390. echo shar: Extracting \"src/prim.c\" \(19818 characters\)
  1391. sed "s/^X//" >src/prim.c <<'END_OF_src/prim.c'
  1392. X/* Table of primitives
  1393. X */
  1394. X
  1395. X#include "scheme.h"
  1396. X
  1397. Xstruct Prim_Init {
  1398. X    Object (*fun)();
  1399. X    char *name;
  1400. X    int minargs, maxargs;
  1401. X    enum discipline disc;
  1402. X} Primitives[] = {
  1403. X
  1404. X    /* auto.c:
  1405. X     */
  1406. X    P_Autoload,          "autoload",                       2, 2,    EVAL,
  1407. X
  1408. X    /* bool.c:
  1409. X     */
  1410. X    P_Booleanp,          "boolean?",                       1, 1,    EVAL,
  1411. X    P_Not,               "not",                            1, 1,    EVAL,
  1412. X    P_Eq,                "eq?",                            2, 2,    EVAL,
  1413. X    P_Eqv,               "eqv?",                           2, 2,    EVAL,
  1414. X    P_Equal,             "equal?",                         2, 2,    EVAL,
  1415. X
  1416. X    /* char.c:
  1417. X     */
  1418. X    P_Charp,             "char?",                          1, 1,    EVAL,
  1419. X    P_Char_To_Integer,   "char->integer",                  1, 1,    EVAL,
  1420. X    P_Integer_To_Char,   "integer->char",                  1, 1,    EVAL,
  1421. X    P_Char_Upper_Case,   "char-upper-case?",               1, 1,    EVAL,
  1422. X    P_Char_Lower_Case,   "char-lower-case?",               1, 1,    EVAL,
  1423. X    P_Char_Alphabetic,   "char-alphabetic?",               1, 1,    EVAL,
  1424. X    P_Char_Numeric,      "char-numeric?",                  1, 1,    EVAL,
  1425. X    P_Char_Whitespace,   "char-whitespace?",               1, 1,    EVAL,
  1426. X    P_Char_Upcase,       "char-upcase",                    1, 1,    EVAL,
  1427. X    P_Char_Downcase,     "char-downcase",                  1, 1,    EVAL,
  1428. X    P_Chr_Eq,            "char=?",                         2, 2,    EVAL,
  1429. X    P_Chr_Less,          "char<?",                         2, 2,    EVAL,
  1430. X    P_Chr_Greater,       "char>?",                         2, 2,    EVAL,
  1431. X    P_Chr_Eq_Less,       "char<=?",                        2, 2,    EVAL,
  1432. X    P_Chr_Eq_Greater,    "char>=?",                        2, 2,    EVAL,
  1433. X    P_Chr_CI_Eq,         "char-ci=?",                      2, 2,    EVAL,
  1434. X    P_Chr_CI_Less,       "char-ci<?",                      2, 2,    EVAL,
  1435. X    P_Chr_CI_Greater,    "char-ci>?",                      2, 2,    EVAL,
  1436. X    P_Chr_CI_Eq_Less,    "char-ci<=?",                     2, 2,    EVAL,
  1437. X    P_Chr_CI_Eq_Greater, "char-ci>=?",                     2, 2,    EVAL,
  1438. X
  1439. X    /* cont.c:
  1440. X     */
  1441. X    P_Control_Pointp,    "control-point?",                 1, 1,    EVAL,
  1442. X    P_Call_CC,           "call-with-current-continuation", 1, 1,    EVAL,
  1443. X    P_Dynamic_Wind,      "dynamic-wind",                   3, 3,    EVAL,
  1444. X    P_Control_Point_Env, "control-point-environment",      1, 1,    EVAL,
  1445. X
  1446. X    /* debug.c:
  1447. X     */
  1448. X    P_Backtrace_List,    "backtrace-list",                 0, 1,    VARARGS,
  1449. X
  1450. X    /* dump.c:
  1451. X     */
  1452. X#ifdef CAN_DUMP
  1453. X    P_Dump,              "dump",                           1, 1,    EVAL,
  1454. X#endif
  1455. X
  1456. X    /* env.c:
  1457. X     */
  1458. X    P_Environmentp,      "environment?",                   1, 1,    EVAL,
  1459. X    P_The_Environment,   "the-environment",                0, 0,    EVAL,
  1460. X    P_Global_Environment,"global-environment",             0, 0,    EVAL,
  1461. X    P_Define,            "define",                         1, MANY, NOEVAL,
  1462. X    P_Define_Macro,      "define-macro",                   1, MANY, NOEVAL,
  1463. X    P_Set,               "set!",                           2, 2,    NOEVAL,
  1464. X    P_Env_List,          "environment->list",              1, 1,    EVAL,
  1465. X    P_Boundp,            "bound?",                         1, 1,    EVAL,
  1466. X
  1467. X    /* error.c:
  1468. X     */
  1469. X    P_Error,             "error",                          2, MANY, VARARGS,
  1470. X    P_Reset,             "reset",                          0, 0,    EVAL,
  1471. X
  1472. X    /* features.c:
  1473. X     */
  1474. X    P_Featurep,          "feature?",                       1, 1,    EVAL,
  1475. X    P_Provide,           "provide",                        1, 1,    EVAL,
  1476. X    P_Require,           "require",                        1, 3,    VARARGS,
  1477. X
  1478. X    /* heap.c:
  1479. X     */
  1480. X    P_Collect,           "collect",                        0, 0,    EVAL,
  1481. X
  1482. X    /* io.c:
  1483. X     */
  1484. X    P_Port_File_Name,    "port-file-name",                 1, 1,    EVAL,
  1485. X    P_Eof_Objectp,       "eof-object?",                    1, 1,    EVAL,
  1486. X    P_Curr_Input_Port,   "current-input-port",             0, 0,    EVAL,
  1487. X    P_Curr_Output_Port,  "current-output-port",            0, 0,    EVAL,
  1488. X    P_Input_Portp,       "input-port?",                    1, 1,    EVAL,
  1489. X    P_Output_Portp,      "output-port?",                   1, 1,    EVAL,
  1490. X    P_Open_Input_File,   "open-input-file",                1, 1,    EVAL,
  1491. X    P_Open_Output_File,  "open-output-file",               1, 1,    EVAL,
  1492. X    P_Close_Port,        "close-port",                     1, 1,    EVAL,
  1493. X    P_With_Input,        "with-input-from-file",           2, 2,    EVAL,
  1494. X    P_With_Output,       "with-output-to-file",            2, 2,    EVAL,
  1495. X    P_Call_With_Input,   "call-with-input-file",           2, 2,    EVAL,
  1496. X    P_Call_With_Output,  "call-with-output-file",          2, 2,    EVAL,
  1497. X    P_Open_Input_String, "open-input-string",              1, 1,    EVAL,
  1498. X    P_Open_Output_String,"open-output-string",             0, 0,    EVAL,
  1499. X    P_Tilde_Expand,      "tilde-expand",                   1, 1,    EVAL,
  1500. X    P_File_Existsp,      "file-exists?",                   1, 1,    EVAL,
  1501. X
  1502. X    /* load.c:
  1503. X     */
  1504. X    P_Load,              "load",                           1, 2,    VARARGS,
  1505. X
  1506. X    /* list.c:
  1507. X     */
  1508. X    P_Cons,              "cons",                           2, 2,    EVAL,
  1509. X    P_Car,               "car",                            1, 1,    EVAL,
  1510. X    P_Cdr,               "cdr",                            1, 1,    EVAL,
  1511. X    P_Cddr,              "cddr",                           1, 1,    EVAL,
  1512. X    P_Cdar,              "cdar",                           1, 1,    EVAL,
  1513. X    P_Cadr,              "cadr",                           1, 1,    EVAL,
  1514. X    P_Caar,              "caar",                           1, 1,    EVAL,
  1515. X    P_Cdddr,             "cdddr",                          1, 1,    EVAL,
  1516. X    P_Cddar,             "cddar",                          1, 1,    EVAL,
  1517. X    P_Cdadr,             "cdadr",                          1, 1,    EVAL,
  1518. X    P_Cdaar,             "cdaar",                          1, 1,    EVAL,
  1519. X    P_Caddr,             "caddr",                          1, 1,    EVAL,
  1520. X    P_Cadar,             "cadar",                          1, 1,    EVAL,
  1521. X    P_Caadr,             "caadr",                          1, 1,    EVAL,
  1522. X    P_Caaar,             "caaar",                          1, 1,    EVAL,
  1523. X    P_Cxr,               "cxr",                            2, 2,    EVAL,
  1524. X    P_Nullp,             "null?",                          1, 1,    EVAL,
  1525. X    P_Pairp,             "pair?",                          1, 1,    EVAL,
  1526. X    P_Setcar,            "set-car!",                       2, 2,    EVAL,
  1527. X    P_Setcdr,            "set-cdr!",                       2, 2,    EVAL,
  1528. X    P_Assq,              "assq",                           2, 2,    EVAL,
  1529. X    P_Assv,              "assv",                           2, 2,    EVAL,
  1530. X    P_Assoc,             "assoc",                          2, 2,    EVAL,
  1531. X    P_Memq,              "memq",                           2, 2,    EVAL,
  1532. X    P_Memv,              "memv",                           2, 2,    EVAL,
  1533. X    P_Member,            "member",                         2, 2,    EVAL,
  1534. X    P_Make_List,         "make-list",                      2, 2,    EVAL,
  1535. X    P_List,              "list",                           0, MANY, VARARGS,
  1536. X    P_Length,            "length",                         1, 1,    EVAL,
  1537. X    P_Append,            "append",                         0, MANY, VARARGS,
  1538. X    P_Append_Set,        "append!",                        0, MANY, VARARGS,
  1539. X    P_Last_Pair,         "last-pair",                      1, 1,    EVAL,
  1540. X    P_Reverse,           "reverse",                        1, 1,    EVAL,
  1541. X    P_Reverse_Set,       "reverse!",                       1, 1,    EVAL,
  1542. X    P_List_Tail,         "list-tail",                      2, 2,    EVAL,
  1543. X    P_List_Ref,          "list-ref",                       2, 2,    EVAL,
  1544. X
  1545. X    /* main.c:
  1546. X     */
  1547. X    P_Command_Line_Args, "command-line-args",              0, 0,    EVAL,
  1548. X
  1549. X    /* math.c:
  1550. X     */
  1551. X    P_Numberp,           "number?",                        1, 1,    EVAL,
  1552. X    P_Complexp,          "complex?",                       1, 1,    EVAL,
  1553. X    P_Realp,             "real?",                          1, 1,    EVAL,
  1554. X    P_Rationalp,         "rational?",                      1, 1,    EVAL,
  1555. X    P_Integerp,          "integer?",                       1, 1,    EVAL,
  1556. X    P_Zerop,             "zero?",                          1, 1,    EVAL,
  1557. X    P_Positivep,         "positive?",                      1, 1,    EVAL,
  1558. X    P_Negativep,         "negative?",                      1, 1,    EVAL,
  1559. X    P_Oddp,              "odd?",                           1, 1,    EVAL,
  1560. X    P_Evenp,             "even?",                          1, 1,    EVAL,
  1561. X    P_Exactp,            "exact?",                         1, 1,    EVAL,
  1562. X    P_Inexactp,          "inexact?",                       1, 1,    EVAL,
  1563. X    P_Generic_Equal,     "=",                              1, MANY, VARARGS,
  1564. X    P_Generic_Less,      "<",                              1, MANY, VARARGS,
  1565. X    P_Generic_Greater,   ">",                              1, MANY, VARARGS,
  1566. X    P_Generic_Eq_Less,   "<=",                             1, MANY, VARARGS,
  1567. X    P_Generic_Eq_Greater,">=",                             1, MANY, VARARGS,
  1568. X    P_Inc,               "1+",                             1, 1,    EVAL,
  1569. X    P_Dec,               "1-",                             1, 1,    EVAL,
  1570. X    P_Generic_Plus,      "+",                              0, MANY, VARARGS,
  1571. X    P_Generic_Minus,     "-",                              1, MANY, VARARGS,
  1572. X    P_Generic_Multiply,  "*",                              0, MANY, VARARGS,
  1573. X    P_Generic_Divide,    "/",                              1, MANY, VARARGS,
  1574. X    P_Abs,               "abs",                            1, 1,    EVAL,
  1575. X    P_Quotient,          "quotient",                       2, 2,    EVAL,
  1576. X    P_Remainder,         "remainder",                      2, 2,    EVAL,
  1577. X    P_Modulo,            "modulo",                         2, 2,    EVAL,
  1578. X    P_Gcd,               "gcd",                            0, MANY, VARARGS,
  1579. X    P_Lcm,               "lcm",                            0, MANY, VARARGS,
  1580. X    P_Floor,             "floor",                          1, 1,    EVAL,
  1581. X    P_Ceiling,           "ceiling",                        1, 1,    EVAL,
  1582. X    P_Truncate,          "truncate",                       1, 1,    EVAL,
  1583. X    P_Round,             "round",                          1, 1,    EVAL,
  1584. X    P_Sqrt,              "sqrt",                           1, 1,    EVAL,
  1585. X    P_Exp,               "exp",                            1, 1,    EVAL,
  1586. X    P_Log,               "log",                            1, 1,    EVAL,
  1587. X    P_Sin,               "sin",                            1, 1,    EVAL,
  1588. X    P_Cos,               "cos",                            1, 1,    EVAL,
  1589. X    P_Tan,               "tan",                            1, 1,    EVAL,
  1590. X    P_Asin,              "asin",                           1, 1,    EVAL,
  1591. X    P_Acos,              "acos",                           1, 1,    EVAL,
  1592. X    P_Atan,              "atan",                           1, 2,    VARARGS,
  1593. X    P_Min,               "min",                            1, MANY, VARARGS,
  1594. X    P_Max,               "max",                            1, MANY, VARARGS,
  1595. X    P_Random,            "random",                         0, 0,    EVAL,
  1596. X    P_Srandom,           "srandom",                        1, 1,    EVAL,
  1597. X
  1598. X    /* prim.c:
  1599. X     */
  1600. X
  1601. X    /* print.c:
  1602. X     */
  1603. X    P_Write,             "write",                          1, 2,    VARARGS,
  1604. X    P_Display,           "display",                        1, 2,    VARARGS,
  1605. X    P_Write_Char,        "write-char",                     1, 2,    VARARGS,
  1606. X    P_Newline,           "newline",                        0, 1,    VARARGS,
  1607. X    P_Print,             "print",                          1, 2,    VARARGS,
  1608. X    P_Clear_Output_Port, "clear-output-port",              0, 1,    VARARGS,
  1609. X    P_Flush_Output_Port, "flush-output-port",              0, 1,    VARARGS,
  1610. X    P_Get_Output_String, "get-output-string",              1, 1,    EVAL,
  1611. X    P_Format,            "format",                         2, MANY, VARARGS,
  1612. X
  1613. X    /* proc.c:
  1614. X     */
  1615. X    P_Procedurep,        "procedure?",                     1, 1,    EVAL,
  1616. X    P_Primitivep,        "primitive?",                     1, 1,    EVAL,
  1617. X    P_Compoundp,         "compound?",                      1, 1,    EVAL,
  1618. X    P_Macrop,            "macro?",                         1, 1,    EVAL,
  1619. X    P_Eval,              "eval",                           1, 2,    VARARGS,
  1620. X    P_Apply,             "apply",                          2, MANY, VARARGS,
  1621. X    P_Lambda,            "lambda",                         2, MANY, NOEVAL,
  1622. X    P_Procedure_Env,     "procedure-environment",          1, 1,    EVAL,
  1623. X    P_Procedure_Lambda,  "procedure-lambda",               1, 1,    EVAL,
  1624. X    P_Begin,             "begin",                          1, MANY, NOEVAL,
  1625. X    P_Begin1,            "begin1",                         1, MANY, NOEVAL,
  1626. X    P_Map,               "map",                            2, MANY, VARARGS,
  1627. X    P_For_Each,          "for-each",                       2, MANY, VARARGS,
  1628. X    P_Macro,             "macro",                          2, MANY, NOEVAL,
  1629. X    P_Macro_Body,        "macro-body",                     1, 1,    EVAL,
  1630. X    P_Macro_Expand,      "macro-expand",                   1, 1,    EVAL,
  1631. X
  1632. X    /* promise.c:
  1633. X     */
  1634. X    P_Delay,             "delay",                          1, 1,    NOEVAL,
  1635. X    P_Force,             "force",                          1, 1,    EVAL,
  1636. X    P_Promisep,          "promise?",                       1, 1,    EVAL,
  1637. X    P_Promise_Env,       "promise-environment",            1, 1,    EVAL,
  1638. X
  1639. X    /* read.c:
  1640. X     */
  1641. X    P_Exit,              "exit",                           0, 1,    VARARGS,
  1642. X    P_Clear_Input_Port,  "clear-input-port",               0, 1,    EVAL,
  1643. X    P_Read,              "read",                           0, 1,    VARARGS,
  1644. X    P_Read_Char,         "read-char",                      0, 1,    VARARGS,
  1645. X    P_Read_String,       "read-string",                    0, 1,    VARARGS,
  1646. X    P_Unread_Char,       "unread-char",                    1, 2,    VARARGS,
  1647. X
  1648. X    /* special.c:
  1649. X     */
  1650. X    P_Quote,             "quote",                          1, 1,    NOEVAL,
  1651. X    P_Quasiquote,        "quasiquote",                     1, 1,    NOEVAL,
  1652. X    P_If,                "if",                             2, MANY, NOEVAL,
  1653. X    P_Case,              "case",                           1, MANY, NOEVAL,
  1654. X    P_Cond,              "cond",                           1, MANY, NOEVAL,
  1655. X    P_Do,                "do",                             2, MANY, NOEVAL,
  1656. X    P_Let,               "let",                            2, MANY, NOEVAL,
  1657. X    P_Letseq,            "let*",                           2, MANY, NOEVAL,
  1658. X    P_Letrec,            "letrec",                         2, MANY, NOEVAL,
  1659. X    P_Fluid_Let,         "fluid-let",                      2, MANY, NOEVAL,
  1660. X    P_And,               "and",                            0, MANY, NOEVAL,
  1661. X    P_Or,                "or",                             0, MANY, NOEVAL,
  1662. X
  1663. X    /* string.c:
  1664. X     */
  1665. X    P_String,            "string",                         0, MANY, VARARGS,
  1666. X    P_Stringp,           "string?",                        1, 1,    EVAL,
  1667. X    P_Make_String,       "make-string",                    1, 2,    VARARGS,
  1668. X    P_String_Length,     "string-length",                  1, 1,    EVAL,
  1669. X    P_String_To_Number,  "string->number",                 1, 1,    EVAL,
  1670. X    P_String_Ref,        "string-ref",                     2, 2,    EVAL,
  1671. X    P_String_Set,        "string-set!",                    3, 3,    EVAL,
  1672. X    P_Substring,         "substring",                      3, 3,    EVAL,
  1673. X    P_String_Copy,       "string-copy",                    1, 1,    EVAL,
  1674. X    P_String_Append,     "string-append",                  0, MANY, VARARGS,
  1675. X    P_List_To_String,    "list->string",                   1, 1,    EVAL,
  1676. X    P_String_To_List,    "string->list",                   1, 1,    EVAL,
  1677. X    P_String_Fill,       "string-fill!",                   2, 2,    EVAL,
  1678. X    P_Substring_Fill,    "substring-fill!",                4, 4,    EVAL,
  1679. X    P_Str_Eq,            "string=?",                       2, 2,    EVAL,
  1680. X    P_Str_Less,          "string<?",                       2, 2,    EVAL,
  1681. X    P_Str_Greater,       "string>?",                       2, 2,    EVAL,
  1682. X    P_Str_Eq_Less,       "string<=?",                      2, 2,    EVAL,
  1683. X    P_Str_Eq_Greater,    "string>=?",                      2, 2,    EVAL,
  1684. X    P_Str_CI_Eq,         "string-ci=?",                    2, 2,    EVAL,
  1685. X    P_Str_CI_Less,       "string-ci<?",                    2, 2,    EVAL,
  1686. X    P_Str_CI_Greater,    "string-ci>?",                    2, 2,    EVAL,
  1687. X    P_Str_CI_Eq_Less,    "string-ci<=?",                   2, 2,    EVAL,
  1688. X    P_Str_CI_Eq_Greater, "string-ci>=?",                   2, 2,    EVAL,
  1689. X    P_Substringp,        "substring?",                     2, 2,    EVAL,
  1690. X    P_CI_Substringp,     "substring-ci?",                  2, 2,    EVAL,
  1691. X
  1692. X    /* symbol.c:
  1693. X     */
  1694. X    P_String_To_Symbol,  "string->symbol",                 1, 1,    EVAL,
  1695. X    P_Oblist,            "oblist",                         0, 0,    EVAL,
  1696. X    P_Symbolp,           "symbol?",                        1, 1,    EVAL,
  1697. X    P_Symbol_To_String,  "symbol->string",                 1, 1,    EVAL,
  1698. X    P_Put,               "put",                            2, 3,    VARARGS,
  1699. X    P_Get,               "get",                            2, 2,    EVAL,
  1700. X    P_Symbol_Plist,      "symbol-plist",                   1, 1,    EVAL,
  1701. X
  1702. X    /* type.c:
  1703. X     */
  1704. X    P_Type,              "type",                           1, 1,    EVAL,
  1705. X    P_Voidp,             "void?",                          1, 1,    EVAL,
  1706. X
  1707. X    /* vector.c:
  1708. X     */
  1709. X    P_Vectorp,           "vector?",                        1, 1,    EVAL,
  1710. X    P_Make_Vector,       "make-vector",                    1, 2,    VARARGS,
  1711. X    P_Vector,            "vector",                         0, MANY, VARARGS,
  1712. X    P_Vector_Length,     "vector-length",                  1, 1,    EVAL,
  1713. X    P_Vector_Ref,        "vector-ref",                     2, 2,    EVAL,
  1714. X    P_Vector_Set,        "vector-set!",                    3, 3,    EVAL,
  1715. X    P_Vector_To_List,    "vector->list",                   1, 1,    EVAL,
  1716. X    P_List_To_Vector,    "list->vector",                   1, 1,    EVAL,
  1717. X    P_Vector_Fill,       "vector-fill!",                   2, 2,    EVAL,
  1718. X    P_Vector_Copy,       "vector-copy",                    1, 1,    EVAL,
  1719. X
  1720. X    0
  1721. X};
  1722. X
  1723. X/* The C-compiler can't initialize unions, thus the primitive procedures
  1724. X * must be created during run-time (the problem actually is that one can't
  1725. X * provide an intializer for the "tag" component of an S_Primitive).
  1726. X */
  1727. X
  1728. XInit_Prim () {
  1729. X    register struct Prim_Init *p;
  1730. X    Object frame, prim, sym;
  1731. X
  1732. X    for (frame = Car (The_Environment), p = Primitives; p->fun; p++) {
  1733. X    prim = Make_Primitive (p->fun, p->name, p->minargs, p->maxargs,
  1734. X        p->disc);
  1735. X    sym = Intern (p->name);
  1736. X    frame = Add_Binding (frame, sym, prim);
  1737. X    }
  1738. X    Car (The_Environment) = frame;
  1739. X    Memoize_Frame (frame);
  1740. X}
  1741. X
  1742. XDefine_Primitive (fun, name, min, max, disc) Object (*fun)(); char *name;
  1743. X    enum discipline disc; {
  1744. X    Object prim, sym, frame;
  1745. X    GC_Node2;
  1746. X
  1747. X    Error_Tag = "define-primitive";
  1748. X    prim = Make_Primitive (fun, name, min, max, disc);
  1749. X    sym = Null;
  1750. X    GC_Link2 (prim, sym);
  1751. X    sym = Intern (name);
  1752. X    if (disc == EVAL && min != max)
  1753. X    Primitive_Error ("~s: number of arguments must be fixed", sym);
  1754. X    frame = Add_Binding (Car (The_Environment), sym, prim);
  1755. X    SYMBOL(sym)->value = prim;
  1756. X    Car (The_Environment) = frame;
  1757. X    GC_Unlink;
  1758. X}
  1759. END_OF_src/prim.c
  1760. if test 19818 -ne `wc -c <src/prim.c`; then
  1761.     echo shar: \"src/prim.c\" unpacked with wrong size!
  1762. fi
  1763. # end of overwriting check
  1764. fi
  1765. if test -f src/stack.s.vax -a "${1}" != "-c" ; then 
  1766.   echo shar: Will not over-write existing file \"src/stack.s.vax\"
  1767. else
  1768. echo shar: Extracting \"src/stack.s.vax\" \(954 characters\)
  1769. sed "s/^X//" >src/stack.s.vax <<'END_OF_src/stack.s.vax'
  1770. X    .text
  1771. X
  1772. X    .globl    _stkbase
  1773. X    .globl    _Special
  1774. X
  1775. X    .globl    _stksize
  1776. X    .align    2
  1777. X_stksize:
  1778. X    .word    0x0000
  1779. X    movl    _stkbase,r0
  1780. X    subl2    sp,r0
  1781. X    addl2    $120,r0
  1782. X    ret
  1783. X
  1784. X    .globl    _saveenv
  1785. X    .align    2
  1786. X_saveenv:
  1787. X    .word    0x0000        # don't save any regs
  1788. X    movl    4(ap),r0    # buffer        -> r0
  1789. X    movl    fp,4(r0)    # frame pointer -> r0[1]
  1790. X    movl    16(fp),8(r0)    # pc of caller  -> r0[2]
  1791. X    movl    sp,12(r0)    # sp            -> r0[3]
  1792. X
  1793. X    movl    sp,r2        # set up loop
  1794. X    movl    _stkbase,r3
  1795. X    movl    r0,r4
  1796. X    addl2    $110,r4
  1797. Xrep1:
  1798. X    movl    (r2)+,(r4)+    # should use movc3
  1799. X    cmpl    r2,r3
  1800. X    blss    rep1
  1801. X
  1802. X    movl    r4,r3        # new-old -> r0[0]  (``relocation'')
  1803. X    subl2    r2,r3
  1804. X    movl    r3,(r0)
  1805. X
  1806. X    movl    _Special,r0
  1807. X    ret
  1808. X
  1809. X    .globl    _jmpenv
  1810. X    .align    2
  1811. X_jmpenv:
  1812. X    .word    0x0000
  1813. X    movl    8(ap),r0    # return value
  1814. X    movl    4(ap),r1    # buffer
  1815. X
  1816. X    movl    12(r1),sp    # restore sp
  1817. X    movl    sp,r2        # set up loop
  1818. X    movl    _stkbase,r3
  1819. X    movl    r1,r4
  1820. X    addl2    $110,r4
  1821. Xrep2:
  1822. X    movl    (r4)+,(r2)+    # should use movc3
  1823. X    cmpl    r2,r3
  1824. X    blss    rep2
  1825. X
  1826. X    movl    4(r1),fp    # restore fp
  1827. X    ret            # return from _saveenv
  1828. END_OF_src/stack.s.vax
  1829. if test 954 -ne `wc -c <src/stack.s.vax`; then
  1830.     echo shar: \"src/stack.s.vax\" unpacked with wrong size!
  1831. fi
  1832. # end of overwriting check
  1833. fi
  1834. if test ! -d scm ; then
  1835.     echo shar: Creating directory \"scm\"
  1836.     mkdir scm
  1837. fi
  1838. echo shar: End of archive 4 \(of 14\).
  1839. cp /dev/null ark4isdone
  1840. MISSING=""
  1841. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do
  1842.     if test ! -f ark${I}isdone ; then
  1843.     MISSING="${MISSING} ${I}"
  1844.     fi
  1845. done
  1846. if test "${MISSING}" = "" ; then
  1847.     echo You have unpacked all 14 archives.
  1848.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1849. else
  1850.     echo You still need to unpack the following archives:
  1851.     echo "        " ${MISSING}
  1852. fi
  1853. ##  End of shell archive.
  1854. exit 0
  1855.