001: package jscheme;
002:
003: import java.io.PrintWriter;
004:
005: import jsint.Evaluator;
006: import jsint.InputPort;
007: import jsint.Pair;
008: import jsint.Scheme;
009: import jsint.Symbol;
010: import jsint.U;
011:
012: /**
013: JScheme - a simple interface to JScheme.
014: <p> This class provides methods to perform common Scheme operations from
015: java. Each instance of <code>JScheme</code> is an isolated Scheme environment.
016:
017: <p>For example, you can:
018: <ul>
019: <li> Create a new Scheme environment:
020: <pre>
021: JScheme js = new JScheme();
022: </pre>
023: <li> Initialize an application by loading Scheme expressions from a file:
024: <pre>
025: js.load(new java.io.File("app.init"));
026: </pre>
027: <li> Run the Scheme procedure
028: <tt>(describe)</tt> to describe the current object like this:
029: <pre>
030: js.call("describe", this);
031: </pre>
032:
033: If you need to call a procedure with more than twenty arguments
034: use apply().
035:
036: <li>Evalute a string as an expression:
037: <pre> String query = "(+ (expt (Math.sin 2.0) 2) (expt (Math.cos 2.0) 2))";
038: System.out.println(query + " = " + js.eval(query));
039: </pre> </ul>
040:
041: <p> Unit test:
042: <pre>
043: (import "jscheme.JScheme")
044: (load "elf/util.scm")
045: (define js (JScheme.forCurrentEvaluator))
046: (assert (equal? (+ 2 3) (.eval js '(+ 2 3))))
047: (assert (= (+ 2 3) (.eval js "(+ 2 3)")))
048: (assert (= (+ 2 3) (.call js "+" 2 3)))
049: (assert (= (+ 2 3) (.call js + 2 3)))
050: (assert (= (+ 2 3) (.apply js "+" (JScheme.list 2 3))))
051: (.load js "(define (f x) (+ x (g x))) (define (g x) (* x 3))")
052: (assert (= (f 3) 12))
053: </pre>
054:
055: **/
056: public class JScheme implements java.io.Serializable {
057:
058: private Evaluator evaluator;
059:
060: /**
061: * Creates a new, isolated Scheme environment.
062: */
063: public JScheme() {
064: evaluator = new Evaluator();
065: }
066:
067: /**
068: * Creates a Scheme environment that shares an evaluation enironment.
069: * Top-level bindings will be shared.
070: */
071: public JScheme(Evaluator e) {
072: evaluator = e;
073: }
074:
075: /**
076: * Returns the Scheme environment that is currently executing Scheme. Only
077: * call this from Scheme (or from Java called from Scheme).
078: */
079: public static JScheme forCurrentEvaluator() {
080: return new JScheme(Scheme.currentEvaluator());
081: }
082:
083: /**
084: * Returns this Scheme environment's evaluator.
085: */
086: public Evaluator getEvaluator() {
087: return evaluator;
088: }
089:
090: /**
091: * Enters this instance's evaluator.
092: */
093: private void enter() {
094: Scheme.pushEvaluator((Evaluator) evaluator);
095: }
096:
097: /**
098: * Exits an evaluator. This must be called for every call to
099: * <code>enter</code>.
100: */
101: private void exit() {
102: Scheme.popEvaluator();
103: }
104:
105: /** Does the Symbol named s have a global value? **/
106: public boolean isDefined(String s) {
107: enter();
108: try {
109: return Symbol.intern(s).isDefined();
110: } finally {
111: exit();
112: }
113: }
114:
115: /** Get the value of the global variable named s. **/
116: public Object getGlobalValue(String s) {
117: enter();
118: try {
119: return Symbol.intern(s).getGlobalValue();
120: } finally {
121: exit();
122: }
123: }
124:
125: /** Set the value of the global variable named s to v. **/
126: public void setGlobalValue(String s, Object v) {
127: enter();
128: try {
129: Symbol.intern(s).setGlobalValue(v);
130: } finally {
131: exit();
132: }
133: }
134:
135: /** Returns the global procedure named s. **/
136: public SchemeProcedure getGlobalSchemeProcedure(String s) {
137: enter();
138: try {
139: return U.toProc(getGlobalValue(s));
140: } finally {
141: exit();
142: }
143: }
144:
145: /** Load Scheme expressions from a Reader, or String. **/
146: public Object load(java.io.Reader in) {
147: enter();
148: try {
149: return Scheme.load(new InputPort(in));
150: } finally {
151: exit();
152: }
153: }
154:
155: public Object load(String in) {
156: return load(new java.io.StringReader(in));
157: }
158:
159: /** Eval or load a string.
160: This is useful for handling command line arguments.
161: If it starts with "(", it is evaled.
162: If it doesn't start with "-", it is loaded.
163: **/
164: public void evalOrLoad(String it) {
165: if (it.startsWith("("))
166: load(new java.io.StringReader(it));
167: else if (!it.startsWith("-")) {
168: enter();
169: try {
170: Scheme.load(it);
171: } finally {
172: exit();
173: }
174: }
175: }
176:
177: /** Call a procedure with 0 to 20 arguments **/
178: public Object call(SchemeProcedure p) {
179: enter();
180: try {
181: return p.apply(list());
182: } finally {
183: exit();
184: }
185: }
186:
187: public Object call(SchemeProcedure p, Object a1) {
188: enter();
189: try {
190: return p.apply(list(a1));
191: } finally {
192: exit();
193: }
194: }
195:
196: public Object call(SchemeProcedure p, Object a1, Object a2) {
197: enter();
198: try {
199: return p.apply(list(a1, a2));
200: } finally {
201: exit();
202: }
203: }
204:
205: public Object call(SchemeProcedure p, Object a1, Object a2,
206: Object a3) {
207: enter();
208: try {
209: return p.apply(list(a1, a2, a3));
210: } finally {
211: exit();
212: }
213: }
214:
215: public Object call(SchemeProcedure p, Object a1, Object a2,
216: Object a3, Object a4) {
217: enter();
218: try {
219: return p.apply(list(a1, a2, a3, a4));
220: } finally {
221: exit();
222: }
223: }
224:
225: public Object call(SchemeProcedure p, Object a1, Object a2,
226: Object a3, Object a4, Object a5) {
227: enter();
228: try {
229: return p.apply(list(a1, a2, a3, a4, a5));
230: } finally {
231: exit();
232: }
233: }
234:
235: public Object call(SchemeProcedure p, Object a1, Object a2,
236: Object a3, Object a4, Object a5, Object a6) {
237: enter();
238: try {
239: return p.apply(list(a1, a2, a3, a4, a5, a6));
240: } finally {
241: exit();
242: }
243: }
244:
245: public Object call(SchemeProcedure p, Object a1, Object a2,
246: Object a3, Object a4, Object a5, Object a6, Object a7) {
247: enter();
248: try {
249: return p.apply(list(a1, a2, a3, a4, a5, a6, a7));
250: } finally {
251: exit();
252: }
253: }
254:
255: public Object call(SchemeProcedure p, Object a1, Object a2,
256: Object a3, Object a4, Object a5, Object a6, Object a7,
257: Object a8) {
258: enter();
259: try {
260: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8));
261: } finally {
262: exit();
263: }
264: }
265:
266: public Object call(SchemeProcedure p, Object a1, Object a2,
267: Object a3, Object a4, Object a5, Object a6, Object a7,
268: Object a8, Object a9) {
269: enter();
270: try {
271: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9));
272: } finally {
273: exit();
274: }
275: }
276:
277: public Object call(SchemeProcedure p, Object a1, Object a2,
278: Object a3, Object a4, Object a5, Object a6, Object a7,
279: Object a8, Object a9, Object a10) {
280: enter();
281: try {
282: return p
283: .apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10));
284: } finally {
285: exit();
286: }
287: }
288:
289: public Object call(SchemeProcedure p, Object a1, Object a2,
290: Object a3, Object a4, Object a5, Object a6, Object a7,
291: Object a8, Object a9, Object a10, Object a11) {
292: enter();
293: try {
294: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
295: a10, a11));
296: } finally {
297: exit();
298: }
299: }
300:
301: public Object call(SchemeProcedure p, Object a1, Object a2,
302: Object a3, Object a4, Object a5, Object a6, Object a7,
303: Object a8, Object a9, Object a10, Object a11, Object a12) {
304: enter();
305: try {
306: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
307: a10, a11, a12));
308: } finally {
309: exit();
310: }
311: }
312:
313: public Object call(SchemeProcedure p, Object a1, Object a2,
314: Object a3, Object a4, Object a5, Object a6, Object a7,
315: Object a8, Object a9, Object a10, Object a11, Object a12,
316: Object a13) {
317: enter();
318: try {
319: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
320: a10, a11, a12, a13));
321: } finally {
322: exit();
323: }
324: }
325:
326: public Object call(SchemeProcedure p, Object a1, Object a2,
327: Object a3, Object a4, Object a5, Object a6, Object a7,
328: Object a8, Object a9, Object a10, Object a11, Object a12,
329: Object a13, Object a14) {
330: enter();
331: try {
332: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
333: a10, a11, a12, a13, a14));
334: } finally {
335: exit();
336: }
337: }
338:
339: public Object call(SchemeProcedure p, Object a1, Object a2,
340: Object a3, Object a4, Object a5, Object a6, Object a7,
341: Object a8, Object a9, Object a10, Object a11, Object a12,
342: Object a13, Object a14, Object a15) {
343: enter();
344: try {
345: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
346: a10, a11, a12, a13, a14, a15));
347: } finally {
348: exit();
349: }
350: }
351:
352: public Object call(SchemeProcedure p, Object a1, Object a2,
353: Object a3, Object a4, Object a5, Object a6, Object a7,
354: Object a8, Object a9, Object a10, Object a11, Object a12,
355: Object a13, Object a14, Object a15, Object a16) {
356: enter();
357: try {
358: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
359: a10, a11, a12, a13, a14, a15, a16));
360: } finally {
361: exit();
362: }
363: }
364:
365: public Object call(SchemeProcedure p, Object a1, Object a2,
366: Object a3, Object a4, Object a5, Object a6, Object a7,
367: Object a8, Object a9, Object a10, Object a11, Object a12,
368: Object a13, Object a14, Object a15, Object a16, Object a17) {
369: enter();
370: try {
371: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
372: a10, a11, a12, a13, a14, a15, a16, a17));
373: } finally {
374: exit();
375: }
376: }
377:
378: public Object call(SchemeProcedure p, Object a1, Object a2,
379: Object a3, Object a4, Object a5, Object a6, Object a7,
380: Object a8, Object a9, Object a10, Object a11, Object a12,
381: Object a13, Object a14, Object a15, Object a16, Object a17,
382: Object a18) {
383: enter();
384: try {
385: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
386: a10, a11, a12, a13, a14, a15, a16, a17, a18));
387: } finally {
388: exit();
389: }
390: }
391:
392: public Object call(SchemeProcedure p, Object a1, Object a2,
393: Object a3, Object a4, Object a5, Object a6, Object a7,
394: Object a8, Object a9, Object a10, Object a11, Object a12,
395: Object a13, Object a14, Object a15, Object a16, Object a17,
396: Object a18, Object a19) {
397: enter();
398: try {
399: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
400: a10, a11, a12, a13, a14, a15, a16, a17, a18, a19));
401: } finally {
402: exit();
403: }
404: }
405:
406: public Object call(SchemeProcedure p, Object a1, Object a2,
407: Object a3, Object a4, Object a5, Object a6, Object a7,
408: Object a8, Object a9, Object a10, Object a11, Object a12,
409: Object a13, Object a14, Object a15, Object a16, Object a17,
410: Object a18, Object a19, Object a20) {
411: enter();
412: try {
413: return p.apply(list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
414: a10, a11, a12, a13, a14, a15, a16, a17, a18, a19,
415: a20));
416: } finally {
417: exit();
418: }
419: }
420:
421: /** Apply a procedure to a list of arguments. **/
422: public Object apply(SchemeProcedure p, SchemePair as) {
423: enter();
424: try {
425: return p.apply(as);
426: } finally {
427: exit();
428: }
429: }
430:
431: public Object apply(SchemeProcedure p, Object[] args) {
432: enter();
433: try {
434: return p.apply(args);
435: } finally {
436: exit();
437: }
438: }
439:
440: /** Call a procedure named p with from 0 to 20 arguments. **/
441: public Object call(String p) {
442: enter();
443: try {
444: return getGlobalSchemeProcedure(p).apply(list());
445: } finally {
446: exit();
447: }
448: }
449:
450: public Object call(String p, Object a1) {
451: enter();
452: try {
453: return getGlobalSchemeProcedure(p).apply(list(a1));
454: } finally {
455: exit();
456: }
457: }
458:
459: public Object call(String p, Object a1, Object a2) {
460: enter();
461: try {
462: return getGlobalSchemeProcedure(p).apply(list(a1, a2));
463: } finally {
464: exit();
465: }
466: }
467:
468: public Object call(String p, Object a1, Object a2, Object a3) {
469: enter();
470: try {
471: return getGlobalSchemeProcedure(p).apply(list(a1, a2, a3));
472: } finally {
473: exit();
474: }
475: }
476:
477: public Object call(String p, Object a1, Object a2, Object a3,
478: Object a4) {
479: enter();
480: try {
481: return getGlobalSchemeProcedure(p).apply(
482: list(a1, a2, a3, a4));
483: } finally {
484: exit();
485: }
486: }
487:
488: public Object call(String p, Object a1, Object a2, Object a3,
489: Object a4, Object a5) {
490: enter();
491: try {
492: return getGlobalSchemeProcedure(p).apply(
493: list(a1, a2, a3, a4, a5));
494: } finally {
495: exit();
496: }
497: }
498:
499: public Object call(String p, Object a1, Object a2, Object a3,
500: Object a4, Object a5, Object a6) {
501: enter();
502: try {
503: return getGlobalSchemeProcedure(p).apply(
504: list(a1, a2, a3, a4, a5, a6));
505: } finally {
506: exit();
507: }
508: }
509:
510: public Object call(String p, Object a1, Object a2, Object a3,
511: Object a4, Object a5, Object a6, Object a7) {
512: enter();
513: try {
514: return getGlobalSchemeProcedure(p).apply(
515: list(a1, a2, a3, a4, a5, a6, a7));
516: } finally {
517: exit();
518: }
519: }
520:
521: public Object call(String p, Object a1, Object a2, Object a3,
522: Object a4, Object a5, Object a6, Object a7, Object a8) {
523: enter();
524: try {
525: return getGlobalSchemeProcedure(p).apply(
526: list(a1, a2, a3, a4, a5, a6, a7, a8));
527: } finally {
528: exit();
529: }
530: }
531:
532: public Object call(String p, Object a1, Object a2, Object a3,
533: Object a4, Object a5, Object a6, Object a7, Object a8,
534: Object a9) {
535: enter();
536: try {
537: return getGlobalSchemeProcedure(p).apply(
538: list(a1, a2, a3, a4, a5, a6, a7, a8, a9));
539: } finally {
540: exit();
541: }
542: }
543:
544: public Object call(String p, Object a1, Object a2, Object a3,
545: Object a4, Object a5, Object a6, Object a7, Object a8,
546: Object a9, Object a10) {
547: enter();
548: try {
549: return getGlobalSchemeProcedure(p).apply(
550: list(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10));
551: } finally {
552: exit();
553: }
554: }
555:
556: public Object call(String p, Object a1, Object a2, Object a3,
557: Object a4, Object a5, Object a6, Object a7, Object a8,
558: Object a9, Object a10, Object a11) {
559: enter();
560: try {
561: return getGlobalSchemeProcedure(p).apply(
562: list(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11));
563: } finally {
564: exit();
565: }
566: }
567:
568: public Object call(String p, Object a1, Object a2, Object a3,
569: Object a4, Object a5, Object a6, Object a7, Object a8,
570: Object a9, Object a10, Object a11, Object a12) {
571: enter();
572: try {
573: return getGlobalSchemeProcedure(p).apply(
574: list(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
575: a12));
576: } finally {
577: exit();
578: }
579: }
580:
581: public Object call(String p, Object a1, Object a2, Object a3,
582: Object a4, Object a5, Object a6, Object a7, Object a8,
583: Object a9, Object a10, Object a11, Object a12, Object a13) {
584: enter();
585: try {
586: return getGlobalSchemeProcedure(p).apply(
587: list(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
588: a12, a13));
589: } finally {
590: exit();
591: }
592: }
593:
594: public Object call(String p, Object a1, Object a2, Object a3,
595: Object a4, Object a5, Object a6, Object a7, Object a8,
596: Object a9, Object a10, Object a11, Object a12, Object a13,
597: Object a14) {
598: enter();
599: try {
600: return getGlobalSchemeProcedure(p).apply(
601: list(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
602: a12, a13, a14));
603: } finally {
604: exit();
605: }
606: }
607:
608: public Object call(String p, Object a1, Object a2, Object a3,
609: Object a4, Object a5, Object a6, Object a7, Object a8,
610: Object a9, Object a10, Object a11, Object a12, Object a13,
611: Object a14, Object a15) {
612: enter();
613: try {
614: return getGlobalSchemeProcedure(p).apply(
615: list(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
616: a12, a13, a14, a15));
617: } finally {
618: exit();
619: }
620: }
621:
622: public Object call(String p, Object a1, Object a2, Object a3,
623: Object a4, Object a5, Object a6, Object a7, Object a8,
624: Object a9, Object a10, Object a11, Object a12, Object a13,
625: Object a14, Object a15, Object a16) {
626: enter();
627: try {
628: return getGlobalSchemeProcedure(p).apply(
629: list(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
630: a12, a13, a14, a15, a16));
631: } finally {
632: exit();
633: }
634: }
635:
636: public Object call(String p, Object a1, Object a2, Object a3,
637: Object a4, Object a5, Object a6, Object a7, Object a8,
638: Object a9, Object a10, Object a11, Object a12, Object a13,
639: Object a14, Object a15, Object a16, Object a17) {
640: enter();
641: try {
642: return getGlobalSchemeProcedure(p).apply(
643: list(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
644: a12, a13, a14, a15, a16, a17));
645: } finally {
646: exit();
647: }
648: }
649:
650: public Object call(String p, Object a1, Object a2, Object a3,
651: Object a4, Object a5, Object a6, Object a7, Object a8,
652: Object a9, Object a10, Object a11, Object a12, Object a13,
653: Object a14, Object a15, Object a16, Object a17, Object a18) {
654: enter();
655: try {
656: return getGlobalSchemeProcedure(p).apply(
657: list(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
658: a12, a13, a14, a15, a16, a17, a18));
659: } finally {
660: exit();
661: }
662: }
663:
664: public Object call(String p, Object a1, Object a2, Object a3,
665: Object a4, Object a5, Object a6, Object a7, Object a8,
666: Object a9, Object a10, Object a11, Object a12, Object a13,
667: Object a14, Object a15, Object a16, Object a17, Object a18,
668: Object a19) {
669: enter();
670: try {
671: return getGlobalSchemeProcedure(p).apply(
672: list(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
673: a12, a13, a14, a15, a16, a17, a18, a19));
674: } finally {
675: exit();
676: }
677: }
678:
679: public Object call(String p, Object a1, Object a2, Object a3,
680: Object a4, Object a5, Object a6, Object a7, Object a8,
681: Object a9, Object a10, Object a11, Object a12, Object a13,
682: Object a14, Object a15, Object a16, Object a17, Object a18,
683: Object a19, Object a20) {
684: enter();
685: try {
686: return getGlobalSchemeProcedure(p)
687: .apply(
688: list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
689: a10, a11, a12, a13, a14, a15, a16,
690: a17, a18, a19, a20));
691: } finally {
692: exit();
693: }
694: }
695:
696: /** Apply a procedure named p to a list of arguments. **/
697: public Object apply(String p, SchemePair as) {
698: enter();
699: try {
700: return getGlobalSchemeProcedure(p).apply(as);
701: } finally {
702: exit();
703: }
704: }
705:
706: /** Evaluate the contents of a string as a Scheme expression. **/
707: public Object eval(String s) {
708: Object it = read(s);
709: return it == InputPort.EOF ? it : eval(it);
710: }
711:
712: /** Evaluate an expression Object **/
713: public Object eval(Object it) {
714: enter();
715: try {
716: return Scheme.evalToplevel(it, jsint.Scheme
717: .getInteractionEnvironment());
718: } finally {
719: exit();
720: }
721: }
722:
723: /** Read an expression from a String. **/
724: public Object read(String s) {
725: enter();
726: try {
727: return (new InputPort(new java.io.StringReader(s))).read();
728: } finally {
729: exit();
730: }
731: }
732:
733: /** Lists of length 0 to 20. **/
734: public static SchemePair list() {
735: return Pair.EMPTY;
736: }
737:
738: public static SchemePair list(Object a0) {
739: return new Pair(a0, list());
740: }
741:
742: public static SchemePair list(Object a0, Object a1) {
743: return new Pair(a0, list(a1));
744: }
745:
746: public static SchemePair list(Object a0, Object a1, Object a2) {
747: return new Pair(a0, list(a1, a2));
748: }
749:
750: public static SchemePair list(Object a0, Object a1, Object a2,
751: Object a3) {
752: return new Pair(a0, list(a1, a2, a3));
753: }
754:
755: public static SchemePair list(Object a0, Object a1, Object a2,
756: Object a3, Object a4) {
757: return new Pair(a0, list(a1, a2, a3, a4));
758: }
759:
760: public static SchemePair list(Object a0, Object a1, Object a2,
761: Object a3, Object a4, Object a5) {
762: return new Pair(a0, list(a1, a2, a3, a4, a5));
763: }
764:
765: public static SchemePair list(Object a0, Object a1, Object a2,
766: Object a3, Object a4, Object a5, Object a6) {
767: return new Pair(a0, list(a1, a2, a3, a4, a5, a6));
768: }
769:
770: public static SchemePair list(Object a0, Object a1, Object a2,
771: Object a3, Object a4, Object a5, Object a6, Object a7) {
772: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7));
773: }
774:
775: public static SchemePair list(Object a0, Object a1, Object a2,
776: Object a3, Object a4, Object a5, Object a6, Object a7,
777: Object a8) {
778: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8));
779: }
780:
781: public static SchemePair list(Object a0, Object a1, Object a2,
782: Object a3, Object a4, Object a5, Object a6, Object a7,
783: Object a8, Object a9) {
784: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9));
785: }
786:
787: public static SchemePair list(Object a0, Object a1, Object a2,
788: Object a3, Object a4, Object a5, Object a6, Object a7,
789: Object a8, Object a9, Object a10) {
790: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
791: a10));
792: }
793:
794: public static SchemePair list(Object a0, Object a1, Object a2,
795: Object a3, Object a4, Object a5, Object a6, Object a7,
796: Object a8, Object a9, Object a10, Object a11) {
797: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
798: a10, a11));
799: }
800:
801: public static SchemePair list(Object a0, Object a1, Object a2,
802: Object a3, Object a4, Object a5, Object a6, Object a7,
803: Object a8, Object a9, Object a10, Object a11, Object a12) {
804: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
805: a10, a11, a12));
806: }
807:
808: public static SchemePair list(Object a0, Object a1, Object a2,
809: Object a3, Object a4, Object a5, Object a6, Object a7,
810: Object a8, Object a9, Object a10, Object a11, Object a12,
811: Object a13) {
812: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
813: a10, a11, a12, a13));
814: }
815:
816: public static SchemePair list(Object a0, Object a1, Object a2,
817: Object a3, Object a4, Object a5, Object a6, Object a7,
818: Object a8, Object a9, Object a10, Object a11, Object a12,
819: Object a13, Object a14) {
820: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
821: a10, a11, a12, a13, a14));
822: }
823:
824: public static SchemePair list(Object a0, Object a1, Object a2,
825: Object a3, Object a4, Object a5, Object a6, Object a7,
826: Object a8, Object a9, Object a10, Object a11, Object a12,
827: Object a13, Object a14, Object a15) {
828: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
829: a10, a11, a12, a13, a14, a15));
830: }
831:
832: public static SchemePair list(Object a0, Object a1, Object a2,
833: Object a3, Object a4, Object a5, Object a6, Object a7,
834: Object a8, Object a9, Object a10, Object a11, Object a12,
835: Object a13, Object a14, Object a15, Object a16) {
836: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
837: a10, a11, a12, a13, a14, a15, a16));
838: }
839:
840: public static SchemePair list(Object a0, Object a1, Object a2,
841: Object a3, Object a4, Object a5, Object a6, Object a7,
842: Object a8, Object a9, Object a10, Object a11, Object a12,
843: Object a13, Object a14, Object a15, Object a16, Object a17) {
844: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
845: a10, a11, a12, a13, a14, a15, a16, a17));
846: }
847:
848: public static SchemePair list(Object a0, Object a1, Object a2,
849: Object a3, Object a4, Object a5, Object a6, Object a7,
850: Object a8, Object a9, Object a10, Object a11, Object a12,
851: Object a13, Object a14, Object a15, Object a16, Object a17,
852: Object a18) {
853: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
854: a10, a11, a12, a13, a14, a15, a16, a17, a18));
855: }
856:
857: public static SchemePair list(Object a0, Object a1, Object a2,
858: Object a3, Object a4, Object a5, Object a6, Object a7,
859: Object a8, Object a9, Object a10, Object a11, Object a12,
860: Object a13, Object a14, Object a15, Object a16, Object a17,
861: Object a18, Object a19) {
862: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
863: a10, a11, a12, a13, a14, a15, a16, a17, a18, a19));
864: }
865:
866: public static SchemePair list(Object a0, Object a1, Object a2,
867: Object a3, Object a4, Object a5, Object a6, Object a7,
868: Object a8, Object a9, Object a10, Object a11, Object a12,
869: Object a13, Object a14, Object a15, Object a16, Object a17,
870: Object a18, Object a19, Object a20) {
871: return new Pair(a0, list(a1, a2, a3, a4, a5, a6, a7, a8, a9,
872: a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20));
873: }
874:
875: public void write(Object x, PrintWriter port, boolean quoted) {
876: enter();
877: try {
878: U.write(x, port, quoted);
879: } finally {
880: exit();
881: }
882: }
883:
884: public void write(Object x, PrintWriter port) {
885: enter();
886: try {
887: U.write(x, port, true);
888: } finally {
889: exit();
890: }
891: }
892:
893: public void display(Object x, PrintWriter port) {
894: enter();
895: try {
896: U.write(x, port, false);
897: } finally {
898: exit();
899: }
900: }
901:
902: public void readEvalPrintLoop() {
903: enter();
904: try {
905: Scheme.readEvalWriteLoop(">");
906: } finally {
907: exit();
908: }
909: }
910:
911: /** Convert from an Object to a primitive type. **/
912: public static boolean booleanValue(Object o) {
913: return o != Boolean.FALSE;
914: }
915:
916: public static byte byteValue(Object o) {
917: return ((Number) o).byteValue();
918: }
919:
920: public static char charValue(Object o) {
921: return (o instanceof Number) ? ((char) ((Number) o)
922: .shortValue()) : ((Character) o).charValue();
923: }
924:
925: public static short shortValue(Object o) {
926: return ((Number) o).shortValue();
927: }
928:
929: public static int intValue(Object o) {
930: return ((Number) o).intValue();
931: }
932:
933: public static long longValue(Object o) {
934: return ((Number) o).longValue();
935: }
936:
937: public static float floatValue(Object o) {
938: return ((Number) o).floatValue();
939: }
940:
941: public static double doubleValue(Object o) {
942: return ((Number) o).doubleValue();
943: }
944:
945: /** Convert from primitive type to Object. **/
946: public static Boolean toObject(boolean x) {
947: return x ? Boolean.TRUE : Boolean.FALSE;
948: }
949:
950: public static Object toObject(byte x) {
951: return new Byte(x);
952: }
953:
954: public static Object toObject(char x) {
955: return new Character(x);
956: }
957:
958: public static Object toObject(short x) {
959: return new Short(x);
960: }
961:
962: public static Object toObject(int x) {
963: return U.toNum(x);
964: }
965:
966: public static Object toObject(long x) {
967: return new Long(x);
968: }
969:
970: public static Object toObject(float x) {
971: return new Float(x);
972: }
973:
974: public static Object toObject(double x) {
975: return new Double(x);
976: }
977:
978: public static Object toObject(Object x) {
979: return x;
980: } // Completeness.
981:
982: }
|