mescc: Use records for Guile: preparation.
[mes.git] / module / language / c99 / info.scm
1 ;;; -*-scheme-*-
2
3 ;;; Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
5 ;;;
6 ;;; This file is part of Mes.
7 ;;;
8 ;;; Mes is free software; you can redistribute it and/or modify it
9 ;;; under the terms of the GNU General Public License as published by
10 ;;; the Free Software Foundation; either version 3 of the License, or (at
11 ;;; your option) any later version.
12 ;;;
13 ;;; Mes is distributed in the hope that it will be useful, but
14 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ;;; GNU General Public License for more details.
17 ;;;
18 ;;; You should have received a copy of the GNU General Public License
19 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
20
21 ;;; info.scm defines [Guile] record data types for compiler.mes
22
23 ;;; Code:
24
25 (define-module (language c99 info)
26   #:use-module (ice-9 optargs)
27   #:use-module (system base pmatch)
28   #:export (<info>
29             ;; <types>
30             ;; <constants>
31             ;; <functions>
32             ;; <globals>
33             ;; <locals>
34             ;; <function>
35             ;; <text>
36             ;; <break>
37             ;; <continue>
38
39             make
40             info?
41
42             .info
43             .types
44             .constants
45             .functions
46             .globals
47             .locals
48             .function
49             .text
50             .break
51             .continue))
52
53 (cond-expand
54  (guile-2)
55  (guile
56   (use-modules (ice-9 syncase)))
57  (mes))
58
59 ;;(include-from-path "language/c99/info.mes")
60
61 (define <info> '<info>)
62 (define <types> '<types>)
63 (define <constants> '<constants>)
64 (define <functions> '<functions>)
65 (define <globals> '<globals>)
66 (define <locals> '<locals>)
67 (define <function> '<function>)
68 (define <text> '<text>)
69 (define <break> '<break>)
70 (define <continue> '<continue>)
71
72 (define* (make o #:key (types '()) (constants '()) (functions '()) (globals '()) (locals '()) (function #f) (text '()) (break '()) (continue '()))
73   (pmatch o
74     (<info> (list <info>
75                   (cons <types> types)
76                   (cons <constants> constants)
77                   (cons <functions> functions)
78                   (cons <globals> globals)
79                   (cons <locals> locals)
80                   (cons <function> function)
81                   (cons <text> text)
82                   (cons <break> break)
83                   (cons <continue> continue)))))
84
85 (define (.types o)
86   (pmatch o
87     ((<info> . ,alist) (assq-ref alist <types>))))
88
89 (define (.constants o)
90   (pmatch o
91     ((<info> . ,alist) (assq-ref alist <constants>))))
92
93 (define (.functions o)
94   (pmatch o
95     ((<info> . ,alist) (assq-ref alist <functions>))))
96
97 (define (.globals o)
98   (pmatch o
99     ((<info> . ,alist) (assq-ref alist <globals>))))
100
101 (define (.locals o)
102   (pmatch o
103     ((<info> . ,alist) (assq-ref alist <locals>))))
104
105 (define (.function o)
106   (pmatch o
107     ((<info> . ,alist) (assq-ref alist <function>))))
108
109 (define (.text o)
110   (pmatch o
111     ((<info> . ,alist) (assq-ref alist <text>))))
112
113 (define (.break o)
114   (pmatch o
115     ((<info> . ,alist) (assq-ref alist <break>))))
116
117 (define (.continue o)
118   (pmatch o
119     ((<info> . ,alist) (assq-ref alist <continue>))))
120
121 (define (info? o)
122   (and (pair? o) (eq? (car o) <info>)))