1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 20:00:19 +02:00
guile/module/oop/goops/accessors.scm
Andy Wingo 00d0489205 move ice-9/ and oop/ under module/
Moved ice-9/ and oop/ under module/, with the idea being that we have
only scheme under module/. Adjusted configure.in and Makefile.am
appropriately. Put oop/ at the end of the compilation order.
2008-11-01 12:44:21 +01:00

73 lines
2.7 KiB
Scheme
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;;; Copyright (C) 1999, 2000, 2005, 2006 Free Software Foundation, Inc.
;;;;
;;;; 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 2, 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 software; see the file COPYING. If not, write to
;;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;;;; Boston, MA 02110-1301 USA
;;;;
(define-module (oop goops accessors)
:use-module (oop goops)
:re-export (standard-define-class)
:export (define-class-with-accessors
define-class-with-accessors-keywords))
(define-macro (define-class-with-accessors name supers . slots)
(let ((eat? #f))
`(standard-define-class
,name ,supers
,@(map-in-order
(lambda (slot)
(cond (eat?
(set! eat? #f)
slot)
((keyword? slot)
(set! eat? #t)
slot)
((pair? slot)
(if (get-keyword #:accessor (cdr slot) #f)
slot
(let ((name (car slot)))
`(,name #:accessor ,name ,@(cdr slot)))))
(else
`(,slot #:accessor ,slot))))
slots))))
(define-macro (define-class-with-accessors-keywords name supers . slots)
(let ((eat? #f))
`(standard-define-class
,name ,supers
,@(map-in-order
(lambda (slot)
(cond (eat?
(set! eat? #f)
slot)
((keyword? slot)
(set! eat? #t)
slot)
((pair? slot)
(let ((slot
(if (get-keyword #:accessor (cdr slot) #f)
slot
(let ((name (car slot)))
`(,name #:accessor ,name ,@(cdr slot))))))
(if (get-keyword #:init-keyword (cdr slot) #f)
slot
(let* ((name (car slot))
(keyword (symbol->keyword name)))
`(,name #:init-keyword ,keyword ,@(cdr slot))))))
(else
`(,slot #:accessor ,slot
#:init-keyword ,(symbol->keyword slot)))))
slots))))