Author: yamakenz
Date: Sun Jul 22 15:23:06 2007
New Revision: 4784

Added:
   sigscheme-trunk/src/module-srfi9.c
Modified:
   sigscheme-trunk/NEWS
   sigscheme-trunk/README
   sigscheme-trunk/configure.in
   sigscheme-trunk/lib/Makefile.am
   sigscheme-trunk/lib/srfi-9.scm
   sigscheme-trunk/src/Makefile.am
   sigscheme-trunk/src/module.c
   sigscheme-trunk/src/sigscheme.h
   sigscheme-trunk/src/sigschemeinternal.h

Log:
* This commit add SRFI-9, but validation is not done yet

* src/sigscheme.h
  - (scm_s_srfi9_define_record_type): New function decl
* src/sigschemeinternal.h
  - (scm_initialize_srfi9): New function decl
* src/module-srfi9.c
  - New file
  - (ERRMSG_MISPLACED_RECORD_DEFINITION, SYMBOL_VALUE): New macro
  - (l_proc_make_record_type; l_proc_record_constructor,
    l_proc_record_predicate, l_proc_record_accessor, l_proc_record_modifier):
    New static variable
  - (scm_initialize_srfi9, scm_s_srfi9_define_record_type): New function
  - (define_record_field): New static function
* src/module.c
  - (module_info_table): Add SRFI-9 entry
* src/Makefile.am
  - (FUNC_TABLES): Add functable-srfi9.c
  - (libsscm_sources): Add module-srfi9.c
* lib/srfi-9.scm
  - (define-record-type, define-record-field): Comment out and replaced by
    module-srfi9.c
* lib/Makefile.am
  - (dist_scmlib_DATA): Add srfi-9.scm
* configure.in
  - Add --enable-srfi9
* README
* NEWS
  - Update


Modified: sigscheme-trunk/NEWS
==============================================================================
--- sigscheme-trunk/NEWS        (original)
+++ sigscheme-trunk/NEWS        Sun Jul 22 15:23:06 2007
@@ -5,6 +5,8 @@
 
   - SRFI-1 List Library (full featured)
 
+  - SRFI-9 Defining Record Types
+
   - SRFI-55 require-extension
 
   - SRFI-95 Sorting and Merging

Modified: sigscheme-trunk/README
==============================================================================
--- sigscheme-trunk/README      (original)
+++ sigscheme-trunk/README      Sun Jul 22 15:23:06 2007
@@ -32,6 +32,7 @@
   - SRFI-2  : AND-LET*: an AND with local bindings, a guarded LET* special form
   - SRFI-6  : Basic String Ports
   - SRFI-8  : receive: Binding to multiple values
+  - SRFI-9  : Defining Record Types
   - SRFI-22 : Running Scheme Scripts on Unix (partial)
   - SRFI-23 : Error Reporting Mechanism
   - SRFI-28 : Basic Format Strings

Modified: sigscheme-trunk/configure.in
==============================================================================
--- sigscheme-trunk/configure.in        (original)
+++ sigscheme-trunk/configure.in        Sun Jul 22 15:23:06 2007
@@ -491,6 +491,7 @@
         use_srfi2=yes
         use_srfi6=yes
         use_srfi8=yes
+        use_srfi9=yes
         use_srfi22=yes
         use_srfi23=yes
         use_srfi28=yes
@@ -510,6 +511,7 @@
         use_srfi2=no
         use_srfi6=no
         use_srfi8=no
+        use_srfi9=no
         use_srfi22=no
         use_srfi23=no
         use_srfi28=no
@@ -529,6 +531,7 @@
         use_srfi2=no
         use_srfi6=no
         use_srfi8=no
+        use_srfi9=no
         use_srfi22=no
         use_srfi23=no
         use_srfi28=no
@@ -548,6 +551,7 @@
         use_srfi2=yes
         use_srfi6=yes
         use_srfi8=yes
+        use_srfi9=yes
         use_srfi22=yes
         use_srfi23=yes
         use_srfi28=yes
@@ -659,6 +663,7 @@
 AX_FEATURE_ARG_Y(srfi2,          [SRFI-2 'and-let*'])
 AX_FEATURE_ARG_Y(srfi6,          [SRFI-6 basic string ports])
 AX_FEATURE_ARG_Y(srfi8,          [SRFI-8 'receive'])
+AX_FEATURE_ARG_Y(srfi9,          [SRFI-9 defining record types])
 AX_FEATURE_ARG_Y(srfi22,         [SRFI-22 running scheme scripts on Unix 
(partial)])
 AX_FEATURE_ARG_Y(srfi23,         [SRFI-23 'error'])
 AX_FEATURE_ARG_Y(srfi28,         [SRFI-28 'format'])
@@ -727,6 +732,7 @@
 eval_c_string: reader srfi6
 srfi1: continuation deep_cadrs load sscm_extensions srfi8 srfi23
 srfi6: port string
+srfi9: load srfi23
 srfi34: continuation srfi23
 srfi38: writer
 srfi55: load sscm_extensions
@@ -876,6 +882,7 @@
 AX_FEATURE_DEFINE(srfi2)
 AX_FEATURE_DEFINE(srfi6)
 AX_FEATURE_DEFINE(srfi8)
+AX_FEATURE_DEFINE(srfi9)
 AX_FEATURE_DEFINE(srfi22)
 AX_FEATURE_DEFINE(srfi23)
 AX_FEATURE_DEFINE(srfi28)
@@ -952,6 +959,7 @@
 AC_SUBST(use_srfi2)
 AC_SUBST(use_srfi6)
 AC_SUBST(use_srfi8)
+AC_SUBST(use_srfi9)
 AC_SUBST(use_srfi22)
 AC_SUBST(use_srfi23)
 AC_SUBST(use_srfi28)
@@ -1106,6 +1114,7 @@
 SRFI-2:  $use_srfi2
 SRFI-6:  $use_srfi6
 SRFI-8:  $use_srfi8
+SRFI-9:  $use_srfi9
 SRFI-22: $use_srfi22
 SRFI-23: $use_srfi23
 SRFI-28: $use_srfi28

Modified: sigscheme-trunk/lib/Makefile.am
==============================================================================
--- sigscheme-trunk/lib/Makefile.am     (original)
+++ sigscheme-trunk/lib/Makefile.am     Sun Jul 22 15:23:06 2007
@@ -1,4 +1,5 @@
-dist_scmlib_DATA = sigscheme-init.scm srfi-1.scm srfi-55.scm srfi-95.scm
+dist_scmlib_DATA = sigscheme-init.scm \
+        srfi-1.scm srfi-9.scm srfi-55.scm srfi-95.scm
 
 # Install into master package's pkgdatadir if --with-master-pkg is specified
 # e.g.)

Modified: sigscheme-trunk/lib/srfi-9.scm
==============================================================================
--- sigscheme-trunk/lib/srfi-9.scm      (original)
+++ sigscheme-trunk/lib/srfi-9.scm      Sun Jul 22 15:23:06 2007
@@ -20,6 +20,13 @@
 ;; WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
+;; ChangeLog
+;;
+;; 2007-07-23 yamaken   - Imported from
+;;                        http://srfi.schemers.org/srfi-9/srfi-9.html
+;;                        and adapted to SigScheme
+
+
 ;; This code is divided into three layers. In top-down order these are:
 ;; 
 ;;    1. Syntax definitions for DEFINE-RECORD-TYPE and an auxillary macro.
@@ -39,33 +46,33 @@
 
 ; Definition of DEFINE-RECORD-TYPE
 
-(define-syntax define-record-type
-  (syntax-rules ()
-    ((define-record-type type
-       (constructor constructor-tag ...)
-       predicate
-       (field-tag accessor . more) ...)
-     (begin
-       (define type
-         (make-record-type 'type '(field-tag ...)))
-       (define constructor
-         (record-constructor type '(constructor-tag ...)))
-       (define predicate
-         (record-predicate type))
-       (define-record-field type field-tag accessor . more)
-       ...))))
+;;(define-syntax define-record-type
+;;  (syntax-rules ()
+;;    ((define-record-type type
+;;       (constructor constructor-tag ...)
+;;       predicate
+;;       (field-tag accessor . more) ...)
+;;     (begin
+;;       (define type
+;;         (make-record-type 'type '(field-tag ...)))
+;;       (define constructor
+;;         (record-constructor type '(constructor-tag ...)))
+;;       (define predicate
+;;         (record-predicate type))
+;;       (define-record-field type field-tag accessor . more)
+;;       ...))))
 
 ; An auxilliary macro for define field accessors and modifiers.
 ; This is needed only because modifiers are optional.
 
-(define-syntax define-record-field
-  (syntax-rules ()
-    ((define-record-field type field-tag accessor)
-     (define accessor (record-accessor type 'field-tag)))
-    ((define-record-field type field-tag accessor modifier)
-     (begin
-       (define accessor (record-accessor type 'field-tag))
-       (define modifier (record-modifier type 'field-tag))))))
+;;(define-syntax define-record-field
+;;  (syntax-rules ()
+;;    ((define-record-field type field-tag accessor)
+;;     (define accessor (record-accessor type 'field-tag)))
+;;    ((define-record-field type field-tag accessor modifier)
+;;     (begin
+;;       (define accessor (record-accessor type 'field-tag))
+;;       (define modifier (record-modifier type 'field-tag))))))
 
 
 ;;

Modified: sigscheme-trunk/src/Makefile.am
==============================================================================
--- sigscheme-trunk/src/Makefile.am     (original)
+++ sigscheme-trunk/src/Makefile.am     Sun Jul 22 15:23:06 2007
@@ -39,6 +39,7 @@
         functable-srfi2.c \
         functable-srfi6.c \
         functable-srfi8.c \
+        functable-srfi9.c \
         functable-srfi23.c \
         functable-srfi28.c \
         functable-srfi34.c \
@@ -101,6 +102,8 @@
        $(BUILD_FUNCTBL_CMD) $@ "scm_functable_srfi6" $<
 functable-srfi8.c: module-srfi8.c $(BUILD_FUNCTBL_DEPS)
        $(BUILD_FUNCTBL_CMD) $@ "scm_functable_srfi8" $<
+functable-srfi9.c: module-srfi9.c $(BUILD_FUNCTBL_DEPS)
+       $(BUILD_FUNCTBL_CMD) $@ "scm_functable_srfi9" $<
 functable-srfi23.c: module-srfi23.c $(BUILD_FUNCTBL_DEPS)
        $(BUILD_FUNCTBL_CMD) $@ "scm_functable_srfi23" $<
 functable-srfi28.c: module-srfi28.c $(BUILD_FUNCTBL_DEPS)
@@ -318,6 +321,9 @@
 endif
 if USE_SRFI8
   libsscm_sources += module-srfi8.c
+endif
+if USE_SRFI9
+  libsscm_sources += module-srfi9.c
 endif
 if USE_SRFI23
   libsscm_sources += module-srfi23.c

Added: sigscheme-trunk/src/module-srfi9.c
==============================================================================
--- (empty file)
+++ sigscheme-trunk/src/module-srfi9.c  Sun Jul 22 15:23:06 2007
@@ -0,0 +1,165 @@
+/*===========================================================================
+ *  Filename : module-srfi9.c
+ *  About    : SRFI-9 Defining Record Types
+ *
+ *  Copyright (c) 2007 SigScheme Project <uim-en AT googlegroups.com>
+ *
+ *  All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *  3. Neither the name of authors nor the names of its contributors
+ *     may be used to endorse or promote products derived from this software
+ *     without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
+ *  IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ *  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+===========================================================================*/
+
+#include <config.h>
+
+#include "sigscheme.h"
+#include "sigschemeinternal.h"
+
+/*=======================================
+  File Local Macro Definitions
+=======================================*/
+#define ERRMSG_MISPLACED_RECORD_DEFINITION                              \
+  "record type definition is not allowed here"
+
+#define SYMBOL_VALUE(sym)                                               \
+    (scm_symbol_value(scm_intern(sym), SCM_INTERACTION_ENV))
+
+/*=======================================
+  File Local Type Definitions
+=======================================*/
+static void define_record_field(ScmObj type_obj, ScmObj field_spec,
+                                ScmObj env);
+
+/*=======================================
+  Variable Definitions
+=======================================*/
+#include "functable-srfi9.c"
+
+SCM_GLOBAL_VARS_BEGIN(static_srfi9);
+#define static
+static ScmObj l_proc_make_record_type;
+static ScmObj l_proc_record_constructor, l_proc_record_predicate;
+static ScmObj l_proc_record_accessor, l_proc_record_modifier;
+#undef static
+SCM_GLOBAL_VARS_END(static_srfi9);
+#define l_proc_make_record_type   SCM_GLOBAL_VAR(static_srfi9,           \
+                                                 l_proc_make_record_type)
+#define l_proc_record_constructor SCM_GLOBAL_VAR(static_srfi9,           \
+                                                 l_proc_record_constructor)
+#define l_proc_record_predicate   SCM_GLOBAL_VAR(static_srfi9,           \
+                                                 l_proc_record_predicate)
+#define l_proc_record_accessor    SCM_GLOBAL_VAR(static_srfi9,           \
+                                                 l_proc_record_accessor)
+#define l_proc_record_modifier    SCM_GLOBAL_VAR(static_srfi9,           \
+                                                 l_proc_record_modifier)
+SCM_DEFINE_STATIC_VARS(static_srfi9);
+
+/*=======================================
+  File Local Function Declarations
+=======================================*/
+
+/*=======================================
+  Function Definitions
+=======================================*/
+SCM_EXPORT void
+scm_initialize_srfi9(void)
+{
+    SCM_GLOBAL_VARS_INIT(static_srfi9);
+
+    scm_register_funcs(scm_functable_srfi9);
+
+    scm_require_module("srfi-23");
+    scm_load_system_file("srfi-9.scm");
+
+    l_proc_make_record_type   = SYMBOL_VALUE("make-record-type");
+    l_proc_record_constructor = SYMBOL_VALUE("record-constructor");
+    l_proc_record_predicate   = SYMBOL_VALUE("record-predicate");
+    l_proc_record_accessor    = SYMBOL_VALUE("record-accessor");
+    l_proc_record_modifier    = SYMBOL_VALUE("record-modifier");
+}
+
+SCM_EXPORT ScmObj
+scm_s_srfi9_define_record_type(ScmObj type_name, ScmObj ctor_spec,
+                               ScmObj pred_name, ScmObj field_specs,
+                               ScmEvalState *eval_state)
+{
+    ScmObj env, type_obj, ctor, pred, ctor_name, field_tags, field_spec, rest;
+    DECLARE_FUNCTION("define-record-type", syntax_variadic_tailrec_3);
+
+    if (!SCM_DEFINABLE_TOPLEVELP(eval_state))
+        ERR(ERRMSG_MISPLACED_RECORD_DEFINITION);
+
+    ENSURE_SYMBOL(type_name);
+    ENSURE_CONS(ctor_spec);
+    ENSURE_SYMBOL(pred_name);
+
+    env = eval_state->env;
+
+    ctor_name = CAR(ctor_spec);
+    field_tags = CDR(ctor_spec);
+
+    type_obj = scm_call(l_proc_make_record_type,
+                        LIST_2(type_name, field_tags));
+    ctor = scm_call(l_proc_record_constructor, LIST_2(type_obj, field_tags));
+    pred = scm_call(l_proc_record_predicate, LIST_1(type_obj));
+    scm_s_define_internal(ScmFirstClassObj,
+                          type_name, LIST_2(SYM_QUOTE, type_obj), env);
+    scm_s_define_internal(ScmFirstClassObj, ctor_name, ctor, env);
+    scm_s_define_internal(ScmFirstClassObj, pred_name, pred, env);
+
+    rest = field_specs;
+    FOR_EACH (field_spec, rest)
+        define_record_field(type_obj, field_spec, env);
+    ENSURE_PROPER_LIST_TERMINATION(rest, field_specs);
+
+    return SCM_UNDEF;
+}
+
+/* define-record-field is not a part of SRFI-9. */
+static void
+define_record_field(ScmObj type_obj, ScmObj field_spec, ScmObj env)
+{
+    ScmObj field_tag, accessor_name, modifier_name, accessor, modifier, rest;
+    DECLARE_INTERNAL_FUNCTION("define-record-type");
+
+    rest = field_spec;
+    field_tag     = MUST_POP_ARG(rest);
+    accessor_name = MUST_POP_ARG(rest);
+    ENSURE_SYMBOL(field_tag);
+    ENSURE_SYMBOL(accessor_name);
+
+    accessor = scm_call(l_proc_record_accessor, LIST_2(type_obj, field_tag));
+    scm_s_define_internal(ScmFirstClassObj, accessor_name, accessor, env);
+
+    if (!NO_MORE_ARG(rest)) {
+        modifier_name = POP(rest);
+        ENSURE_SYMBOL(modifier_name);
+
+        modifier = scm_call(l_proc_record_modifier,
+                            LIST_2(type_obj, field_tag));
+        scm_s_define_internal(ScmFirstClassObj, modifier_name, modifier, env);
+    }
+    ENSURE_PROPER_LIST_TERMINATION(rest, field_spec);
+}

Modified: sigscheme-trunk/src/module.c
==============================================================================
--- sigscheme-trunk/src/module.c        (original)
+++ sigscheme-trunk/src/module.c        Sun Jul 22 15:23:06 2007
@@ -86,6 +86,9 @@
 #if SCM_USE_SRFI8
     {"srfi-8", scm_initialize_srfi8, NULL},
 #endif
+#if SCM_USE_SRFI9
+    {"srfi-9", scm_initialize_srfi9, NULL},
+#endif
 #if SCM_USE_SRFI23
     {"srfi-23", scm_initialize_srfi23, NULL},
 #endif

Modified: sigscheme-trunk/src/sigscheme.h
==============================================================================
--- sigscheme-trunk/src/sigscheme.h     (original)
+++ sigscheme-trunk/src/sigscheme.h     Sun Jul 22 15:23:06 2007
@@ -1711,6 +1711,15 @@
                                       ScmEvalState *eval_state);
 #endif
 
+/* module-srfi9.c */
+#if SCM_USE_SRFI9
+SCM_EXPORT ScmObj scm_s_srfi9_define_record_type(ScmObj type_name,
+                                                 ScmObj ctor_spec,
+                                                 ScmObj pred_name,
+                                                 ScmObj field_specs,
+                                                 ScmEvalState *eval_state);
+#endif
+
 /* module-srfi23.c */
 #if SCM_USE_SRFI23
 SCM_EXPORT ScmObj scm_p_srfi23_error(ScmObj reason, ScmObj args);

Modified: sigscheme-trunk/src/sigschemeinternal.h
==============================================================================
--- sigscheme-trunk/src/sigschemeinternal.h     (original)
+++ sigscheme-trunk/src/sigschemeinternal.h     Sun Jul 22 15:23:06 2007
@@ -816,6 +816,11 @@
 SCM_EXPORT void scm_initialize_srfi8(void);
 #endif
 
+/* module-srfi9.c */
+#if SCM_USE_SRFI9
+SCM_EXPORT void scm_initialize_srfi9(void);
+#endif
+
 /* module-srfi23.c */
 #if SCM_USE_SRFI23
 SCM_EXPORT void scm_initialize_srfi23(void);

Reply via email to