01: package kawa.standard;
02:
03: import kawa.lang.*;
04: import gnu.expr.*;
05:
06: public class IfFeature {
07: public static boolean testFeature(Object form) {
08: if (form instanceof SyntaxForm) {
09: SyntaxForm sf = (SyntaxForm) form;
10: form = sf.form;
11: }
12: if (form instanceof String)
13: return hasFeature((String) form);
14: return false; // FIXME - return error
15: }
16:
17: public static boolean hasFeature(String name) {
18: if (name == "kawa")
19: return true;
20: if (name == "srfi-0") // cond-expand
21: return true;
22: //if (name == "srfi-1") return true; // lists - only if require used.
23: if (name == "srfi-4") // Homogeneous numeric vector datatypes
24: return true;
25: if (name == "srfi-6") // Basic String Ports
26: return true;
27: if (name == "srfi-8") // receive: Binding to multiple values
28: return true;
29: if (name == "srfi-9") // Defining Record Types
30: return true;
31: if (name == "srfi-11") // let-values, let*-values
32: return true;
33: if (name == "srfi-16") // case-lambda
34: return true;
35: if (name == "srfi-17") // Generalized set!
36: return true;
37: if (name == "srfi-23") // Error reporting mechanism
38: return true;
39: if (name == "srfi-25") // Multi-dimensional Array Primitives
40: return true;
41: if (name == "srfi-26") // Notation for Specializing Parameters
42: return true;
43: if (name == "srfi-28") // Basic Format Strings
44: return true;
45: if (name == "srfi-30") // Nested Multi-line Comments.
46: return true;
47: if (name == "srfi-39") // Parameter objects
48: return true;
49:
50: String provide_name = ("%provide%" + name).intern();
51: Compilation comp = Compilation.getCurrent();
52: Declaration decl = comp.lookup(provide_name, -1);
53: if (decl != null && !decl.getFlag(Declaration.IS_UNKNOWN))
54: return true;
55: return false;
56: }
57: }
|