-
Notifications
You must be signed in to change notification settings - Fork 10
/
slot-access.ss
58 lines (49 loc) · 2.42 KB
/
slot-access.ss
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
; *************************************************************************
; Copyright (c) 1992 Xerox Corporation.
; All Rights Reserved.
;
; Use, reproduction, and preparation of derivative works are permitted.
; Any copy of this software or of any derivative work must include the
; above copyright notice of Xerox Corporation, this paragraph and the
; one after it. Any distribution of this software or derivative works
; must comply with all applicable United States export control laws.
;
; This software is made available AS IS, and XEROX CORPORATION DISCLAIMS
; ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
; PURPOSE, AND NOTWITHSTANDING ANY OTHER PROVISION CONTAINED HEREIN, ANY
; LIABILITY FOR DAMAGES RESULTING FROM THE SOFTWARE OR ITS USE IS
; EXPRESSLY DISCLAIMED, WHETHER ARISING IN CONTRACT, TORT (INCLUDING
; NEGLIGENCE) OR STRICT LIABILITY, EVEN IF XEROX CORPORATION IS ADVISED
; OF THE POSSIBILITY OF SUCH DAMAGES.
; *************************************************************************
;
; port to R6RS -- 2007 Christian Sloma
;
(library (clos slot-access)
(export slot-ref
slot-set!
register-class-of-classes!)
(import (only (rnrs) define set! let if eq? cadr caddr assq quote)
(clos private allocation)
(clos private core-class-layout)
(clos private compat))
(define <class> #f)
(define (register-class-of-classes! class)
(set! <class> class))
(define (slot-ref inst slot-name)
(let ((class (instance-class inst)))
(if (eq? class <class>) ;; break loop -- assumes <class> does not change
(instance-ref inst (position slot-name core-class-slot-names))
(let ((slot-info (get-slot-info class slot-name)))
((cadr slot-info) inst)))))
(define (slot-set! inst slot-name val)
(let ((class (instance-class inst)))
(if (eq? class <class>) ;; break loop -- assumes <class> does not change
(instance-set! inst (position slot-name core-class-slot-names) val)
(let ((slot-info (get-slot-info class slot-name)))
((caddr slot-info) inst val)))))
(define (get-slot-info class slot-name)
(let ((getters-and-setters (slot-ref class 'getters-and-setters)))
(assq slot-name getters-and-setters)))
) ;; library (clos slot-access)