6c1d348961448749f0d669c4b20126879c23c396
[mes.git] / src / module.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * GNU Mes --- Maxwell Equations of Software
3  * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of GNU Mes.
6  *
7  * GNU Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * GNU Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 SCM
22 make_initial_module (SCM a)
23 {
24   SCM fields = cell_nil;
25   fields = cons (cstring_to_symbol ("globals"), fields);
26   fields = cons (cstring_to_symbol ("locals"), fields);
27   fields = cons (cstring_to_symbol ("name"), fields);
28   fields = cons (cstring_to_symbol ("<module>"), fields);
29   SCM module_type = make_struct (cstring_to_symbol ("record-type"), fields, cell_unspecified);
30   SCM module_type_name = cstring_to_symbol ("<module>");
31   a = acons (module_type_name, module_type, a);
32   SCM values = cell_nil;
33   SCM name = cons (cstring_to_symbol ("boot"), cell_nil);
34   SCM globals = cell_nil;
35   values = cons (a, values);
36   values = cons (globals, values);
37   values = cons (name, values);
38   SCM module = make_struct (module_type_name, values, cell_unspecified);
39   return module;
40 }
41
42 SCM
43 module_ref (SCM module, SCM name)
44 {
45   SCM x = module_variable (module, name);
46   if (x == cell_f)
47     return cell_undefined;
48   return CDR (x);
49 }
50
51 SCM
52 module_variable (SCM module, SCM name)
53 {
54   //SCM locals = struct_ref (module, 4);
55   SCM locals = module;
56   return assq (name, locals);
57 }