mes: Support srfi-9-gnu.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 4 May 2018 10:44:05 +0000 (12:44 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 4 May 2018 10:44:05 +0000 (12:44 +0200)
* module/srfi/srfi-9/gnu.mes: New file.  Support srfi-9-gnu.
* tests/srfi-9.test: Test it.
* tests/srfi-9.test-guile:

build-aux/build-guile.sh
check.sh
module/mes/test.mes
module/mes/test.scm [new file with mode: 0644]
module/srfi/srfi-9.mes
module/srfi/srfi-9/gnu.mes [new file with mode: 0644]
tests/record.test [deleted file]
tests/record.test-guile [deleted symlink]
tests/srfi-9.test [new file with mode: 0755]
tests/srfi-9.test-guile [new symlink]

index 736408079b9ce13fc5a595bfa77e0c9b4525eb16..00834fbcfa5472dbfd3a766ededfb27d12180b2a 100755 (executable)
@@ -31,6 +31,7 @@ mes/as.scm
 mes/bytevectors.scm
 mes/elf.scm
 mes/guile.scm
+mes/test.scm
 mes/M1.scm"
 
 export srcdir=.
index 7c4eb0b3a5b075b5c656ecae57d0b7837aa7a069..9c8b2fab34ff3353ab22cbe6449082ee39daae4e 100755 (executable)
--- a/check.sh
+++ b/check.sh
@@ -41,13 +41,13 @@ tests/cwv.test
 tests/math.test
 tests/vector.test
 tests/srfi-1.test
+tests/srfi-9.test
 tests/srfi-13.test
 tests/srfi-14.test
 tests/srfi-43.test
 tests/optargs.test
 tests/fluids.test
 tests/catch.test
-tests/record.test
 tests/getopt-long.test
 tests/guile.test
 tests/syntax.test
index 97c6e601ed417de84015a51591c133b072138679..eddb567302b73e33e14f8e93ecab0adb42ed9d92 100644 (file)
 
 ;;; Code:
 
-(mes-use-module (mes base))
+(cond-expand
+ (mes
+  (mes-use-module (mes base)))
+ (else))
+
 (cond-expand
  (mes
   (define mes? #t)
diff --git a/module/mes/test.scm b/module/mes/test.scm
new file mode 100644 (file)
index 0000000..2e27db1
--- /dev/null
@@ -0,0 +1,22 @@
+;;; -*-scheme-*-
+
+;;; Mes --- Maxwell Equations of Software
+;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+;;;
+;;; This file is part of Mes.
+;;;
+;;; Mes is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; Mes is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (mes test))
+(include-from-path "mes/test.mes")
index b09e2597c76a8fa3d522110ccc82ff7414c5691a..47767c9d73632e7aa2fb601ba59ec7d44392779c 100644 (file)
 
 (define (record-getter type field)
   (let ((i (record-field-index type field)))
-    (lambda (o)
+    (lambda (o . field?)
       (if (not (eq? (record-type o) type)) (error "record getter: record expected" type o)
-          (vector-ref o i)))))
+          (if (pair? field?) field
+              (vector-ref o i))))))
 
 (define (record-setter type field)
   (let ((i (record-field-index type field)))
diff --git a/module/srfi/srfi-9/gnu.mes b/module/srfi/srfi-9/gnu.mes
new file mode 100644 (file)
index 0000000..8bdad79
--- /dev/null
@@ -0,0 +1,37 @@
+;;; -*-scheme-*-
+
+;;; Mes --- Maxwell Equations of Software
+;;; Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+;;;
+;;; This file is part of Mes.
+;;;
+;;; Mes is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; Mes is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; srfi-9.mes - GNU immutable records.
+
+(define-macro (define-immutable-record-type type constructor+params predicate . fields)
+  `(define-record-type ,type ,constructor+params ,predicate ,@(map (lambda (f) (list-head f 2)) fields)))
+
+(define-macro (set-field o getters value)
+  `(let ((getter ,(car getters)))
+     (let ((type (record-type ,o))
+           (set (getter ,o #t)))
+       (define (field->value field)
+         (if (eq? set field) ,value
+             ((record-getter type field) ,o)))
+       (let* ((fields (record-fields type))
+              (values (map field->value fields)))
+         (apply (record-constructor type fields) values)))))
diff --git a/tests/record.test b/tests/record.test
deleted file mode 100755 (executable)
index 97e9471..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#! /bin/sh
-# -*-scheme-*-
-MES=${MES-$(dirname $0)/../src/mes}
-$MES -s $0
-exit $?
-!#
-
-;;; -*-scheme-*-
-
-;;; Mes --- Maxwell Equations of Software
-;;; Copyright © 2016,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
-;;;
-;;; This file is part of Mes.
-;;;
-;;; Mes is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or (at
-;;; your option) any later version.
-;;;
-;;; Mes is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
-
-(mes-use-module (srfi srfi-0))
-(mes-use-module (srfi srfi-9))
-(mes-use-module (mes test))
-
-(cond-expand
- (guile
-  (use-modules (srfi srfi-9)))
- (mes))
-
-(pass-if "first dummy" #t)
-(pass-if-not "second dummy" #f)
-
-(define-record-type lexical-token
-  (make-lexical-token category source value)
-  lexical-token?
-  (category lexical-token-category)
-  (source   lexical-token-source)
-  (value    lexical-token-value))
-
-(pass-if "record"
-  (lexical-token? (make-lexical-token 'x 'y 'z)))
-
-(result 'report)
diff --git a/tests/record.test-guile b/tests/record.test-guile
deleted file mode 120000 (symlink)
index 5631f4a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-base.test-guile
\ No newline at end of file
diff --git a/tests/srfi-9.test b/tests/srfi-9.test
new file mode 100755 (executable)
index 0000000..799c671
--- /dev/null
@@ -0,0 +1,56 @@
+#! /bin/sh
+# -*-scheme-*-
+MES=${MES-$(dirname $0)/../src/mes}
+$MES -s $0
+exit $?
+!#
+
+;;; -*-scheme-*-
+
+;;; Mes --- Maxwell Equations of Software
+;;; Copyright © 2016,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+;;;
+;;; This file is part of Mes.
+;;;
+;;; Mes is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; Mes is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+
+(cond-expand
+ (mes
+  (mes-use-module (srfi srfi-9))
+  (mes-use-module (srfi srfi-9 gnu))
+  (mes-use-module (mes test)))
+ (guile
+  (use-modules (srfi srfi-9))
+  (use-modules (srfi srfi-9 gnu))
+  (use-modules (mes test))))
+
+(pass-if "first dummy" #t)
+(pass-if-not "second dummy" #f)
+
+(define-record-type lexical-token
+  (make-lexical-token category source value)
+  lexical-token?
+  (category lexical-token-category)
+  (source   lexical-token-source)
+  (value    lexical-token-value))
+
+(pass-if "record"
+  (lexical-token? (make-lexical-token 'x 'y 'z)))
+
+(pass-if-equal "set-field" "baar"
+         (let ((token (make-lexical-token 'foo "bar" 'baz)))
+           (lexical-token-category (set-field token (lexical-token-category) "baar"))))
+
+(result 'report)
diff --git a/tests/srfi-9.test-guile b/tests/srfi-9.test-guile
new file mode 120000 (symlink)
index 0000000..5631f4a
--- /dev/null
@@ -0,0 +1 @@
+base.test-guile
\ No newline at end of file