;;; -*-scheme-*- ;;; GNU Mes --- Maxwell Equations of Software ;;; Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen ;;; ;;; This file is part of GNU Mes. ;;; ;;; GNU 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. ;;; ;;; GNU 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 GNU Mes. If not, see . ;;; 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 (struct-vtable ,o)) (name (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 name fields) values)))))