From 3026463d4ccfb749c851813a498c74766f270fae Mon Sep 17 00:00:00 2001
From: John Lenz
Date: Wed, 5 Jul 2006 01:54:32 +0000
Subject: [PATCH] Chicken: Add the %feature("constasvar"), which exports
constants as variables instead of functions
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9197 626c5289-ae23-0410-ae9c-e8d60b6d4f22
---
SWIG/CHANGES.current | 5 +++++
SWIG/Doc/Manual/Chicken.html | 10 ++++++++++
SWIG/Source/Modules/chicken.cxx | 23 +++++++++++++++++++----
3 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/SWIG/CHANGES.current b/SWIG/CHANGES.current
index 97dceaa74..59170f9bb 100644
--- a/SWIG/CHANGES.current
+++ b/SWIG/CHANGES.current
@@ -1,5 +1,10 @@
Version 1.3.30 (in progress)
============================
+07/04/2006: wuzzeb (John Lenz)
+ [Chicken]
+ Add %feature("constasvar"), which instead of exporting a constant as a
+ scheme function, exports the constant as a scheme variable. Update the
+ documentation as well.
07/04/2006: wsfulton
New explicitcall feature which generates additional wrappers for virtual methods
diff --git a/SWIG/Doc/Manual/Chicken.html b/SWIG/Doc/Manual/Chicken.html
index c415478b9..025738a5a 100644
--- a/SWIG/Doc/Manual/Chicken.html
+++ b/SWIG/Doc/Manual/Chicken.html
@@ -217,6 +217,16 @@
use (my-variable).
+
+ The %feature("constasvar") can be applied to any constant
+ or immutable variable. Instead of exporting the constant as
+ as function that must be called, the constant will appear as a
+ scheme variable. This causes the generated .scm file just contain the code
+ (set! MYCONSTANT1 (MYCONSTANT1)). See
+ Features and the %feature directive
+ for info on how to apply the %feature.
+
+
18.2.4 Functions
diff --git a/SWIG/Source/Modules/chicken.cxx b/SWIG/Source/Modules/chicken.cxx
index 22c6522af..1e3cddcd9 100644
--- a/SWIG/Source/Modules/chicken.cxx
+++ b/SWIG/Source/Modules/chicken.cxx
@@ -60,7 +60,8 @@ static bool exporting_constructor = false;
static String *constructor_name = 0;
static String *member_name = 0;
-/* sections of the clos code */
+/* sections of the .scm code */
+static String *scm_const_defs = 0;
static String *clos_class_defines = 0;
static String *clos_methods = 0;
@@ -217,6 +218,7 @@ CHICKEN::top(Node *n)
clos_class_defines = NewString("");
clos_methods = NewString("");
+ scm_const_defs = NewString("");
Printf(f_runtime, "/* -*- buffer-read-only: t -*- vi: set ro: */\n");
Swig_banner(f_runtime);
@@ -279,6 +281,8 @@ CHICKEN::top(Node *n)
Printf (f_scm, "%s\n", closprefix);
Printf (f_scm, "%s\n", clos_class_defines);
Printf (f_scm, "%s\n", clos_methods);
+ } else {
+ Printf (f_scm, "%s\n", scm_const_defs);
}
Printf(f_scm, "%s\n", chickentext);
@@ -304,6 +308,7 @@ CHICKEN::top(Node *n)
Delete(clos_class_defines);
Delete(clos_methods);
+ Delete(scm_const_defs);
/* Close all of the files */
Delete(primitive_names);
@@ -824,13 +829,18 @@ CHICKEN::variableWrapper(Node *n) {
Node *class_node = classLookup(t);
String *clos_code = Getattr(n, "tmap:varin:closcode");
- if (class_node && clos_code) {
+ if (class_node && clos_code && !GetFlag(n, "feature:immutable")) {
Replaceall(clos_code,"$input", "(car lst)");
Printv(clos_methods, "(define (", clos_name, " . lst) (if (null? lst) (", chickenPrimitiveName(scmname), ") (",
chickenPrimitiveName(scmname), " ", clos_code, ")))\n", NIL);
} else {
/* Simply re-export the procedure */
- Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL);
+ if (GetFlag(n, "feature:immutable") && GetFlag(n, "feature:constasvar")) {
+ Printv(clos_methods, "(define ", clos_name, " (", chickenPrimitiveName(scmname), "))\n", NIL);
+ Printv(scm_const_defs, "(set! ", scmname, " (", scmname, "))\n", NIL);
+ } else {
+ Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL);
+ }
}
Delete(clos_name);
}
@@ -1008,7 +1018,12 @@ CHICKEN::constantWrapper(Node *n)
clos_name = NewString(member_name);
else
clos_name = chickenNameMapping(scmname, (char *)"");
- Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL);
+ if (GetFlag(n,"feature:constasvar")) {
+ Printv(clos_methods, "(define ", clos_name, " (", chickenPrimitiveName(scmname), "))\n", NIL);
+ Printv(scm_const_defs, "(set! ", scmname, " (", scmname, "))\n", NIL);
+ } else {
+ Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL);
+ }
Delete(clos_name);
}