summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2015-09-21 19:41:17 -0400
committerDavid Thompson <dthompson2@worcester.edu>2015-09-21 19:41:17 -0400
commitb7bf25020f146331d161d86ef30df31d2959a8dc (patch)
treea396e712ea914a96110005ee925fdcdeb95b2373
parentf38bfe77264907d8b949aab2c0b27a9d705f239f (diff)
Add new record type syntax.
* sly/record.scm: New file. * Makefile.am (SOURCES): Add it.
-rw-r--r--Makefile.am1
-rw-r--r--sly/record.scm54
2 files changed, 55 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am
index dad4409..f7aa9cf 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -42,6 +42,7 @@ SOURCES = \
sly/repl.scm \
sly/signal.scm \
sly/window.scm \
+ sly/record.scm \
sly/render/utils.scm \
sly/render/color.scm \
sly/render/camera.scm \
diff --git a/sly/record.scm b/sly/record.scm
new file mode 100644
index 0000000..8221b14
--- /dev/null
+++ b/sly/record.scm
@@ -0,0 +1,54 @@
+;;; Sly
+;;; Copyright (C) 2015 David Thompson <davet@gnu.org>
+;;;
+;;; This program 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.
+;;;
+;;; This program 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 this program. If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Immutable record type syntax with keyword argument constructor,
+;; field inheritance, and default field values.
+;;
+;;; Code:
+
+(define-module (sly record)
+ #:use-module (srfi srfi-9)
+ #:export (define-record-type*))
+
+(define-syntax-rule (define-record-type* type
+ constructor keyword-constructor
+ predicate
+ (field getter default) ...)
+ "Define a new, immutable record type named TYPE. PREDICATE is the
+name of the procedure that tests if an object is of TYPE. A GETTER is
+the name of the accessor for its respective FIELD. CONSTRUCTOR is the
+name of the record type's low-level constructor that uses positional
+arguments corresponding to the order in which the fields are
+specified. KEYWORD-CONSTRUCTOR is the name of the high-level
+constructor that uses keyword arguments for each FIELD whose values
+correspond to the DEFAULT associated with that field. Additionally, a
+special keyword, #:inherit, can be used to copy values from another
+instance of TYPE and only change the fields that are explicitly
+overridden."
+ (begin
+ (define-record-type type
+ (constructor field ...)
+ predicate
+ (field getter) ...)
+
+ (define keyword-constructor
+ (let ((default-record (constructor default ...)))
+ (lambda* (#:key (inherit default-record)
+ (field (getter inherit)) ...)
+ (constructor field ...))))))