mescc: Use records for Guile: preparation.
[mes.git] / module / language / c99 / info.mes
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 ;;; Commentary:
22
23 ;;; info.mes defines a record-interface to simplistic list data
24 ;;; structures.
25
26 ;;; Code:
27
28 (cond-expand
29  (guile-2)
30  (guile)
31  (mes
32   (mes-use-module (mes optargs))
33   (mes-use-module (mes pmatch))))
34
35 (define <info> '<info>)
36 (define <types> '<types>)
37 (define <constants> '<constants>)
38 (define <functions> '<functions>)
39 (define <globals> '<globals>)
40 (define <locals> '<locals>)
41 (define <function> '<function>)
42 (define <text> '<text>)
43 (define <break> '<break>)
44 (define <continue> '<continue>)
45
46 (define (.types o)
47   (pmatch o
48     ((<info> . ,alist) (assq-ref alist <types>))))
49
50 (define (.constants o)
51   (pmatch o
52     ((<info> . ,alist) (assq-ref alist <constants>))))
53
54 (define (.functions o)
55   (pmatch o
56     ((<info> . ,alist) (assq-ref alist <functions>))))
57
58 (define (.globals o)
59   (pmatch o
60     ((<info> . ,alist) (assq-ref alist <globals>))))
61
62 (define (.locals o)
63   (pmatch o
64     ((<info> . ,alist) (assq-ref alist <locals>))))
65
66 (define (.function o)
67   (pmatch o
68     ((<info> . ,alist) (assq-ref alist <function>))))
69
70 (define (.text o)
71   (pmatch o
72     ((<info> . ,alist) (assq-ref alist <text>))))
73
74 (define (.break o)
75   (pmatch o
76     ((<info> . ,alist) (assq-ref alist <break>))))
77
78 (define (.continue o)
79   (pmatch o
80     ((<info> . ,alist) (assq-ref alist <continue>))))
81
82 (define (info? o)
83   (and (pair? o) (eq? (car o) <info>)))
84
85 (define* (make o #:key (types '()) (constants '()) (functions '()) (globals '()) (locals '()) (function #f) (text '()) (break '()) (continue '()))
86   (pmatch o
87     (<info> (list <info>
88                   (cons <types> types)
89                   (cons <constants> constants)
90                   (cons <functions> functions)
91                   (cons <globals> globals)
92                   (cons <locals> locals)
93                   (cons <function> function)
94                   (cons <text> text)
95                   (cons <break> break)
96                   (cons <continue> continue)))))