lib/pluck/src/toplevel/definitions.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const pluck = @import("../root.zig");
2
3 const pexpr = pluck.pexpr;
4 const PExpr = pexpr.PExpr;
5 const Symbol = pexpr.Symbol;
6
7 const context_owner = @import("context.zig");
8 const ToplevelContext = context_owner.ToplevelContext;
9
10 pub fn clearUserDefinitions(self: *ToplevelContext) void {
11 self.definitions.clearUserDefinitions();
12 }
13
14 pub fn removeUserDefinition(self: *ToplevelContext, name: Symbol) void {
15 if (self.definitions.lookupDefinition(name)) |def| {
16 if (def.is_stdlib) {
17 return;
18 }
19 } else {
20 return;
21 }
22
23 if (self.definitions.remove(name)) |expr| {
24 expr.deinit(self.arena.allocator());
25 }
26 }
27
28 pub fn isDefined(self: *const ToplevelContext, name: Symbol) bool {
29 return self.definitions.isDefined(name);
30 }
31
32 pub fn lookup(self: *const ToplevelContext, name: Symbol) ?*PExpr {
33 return self.definitions.lookup(name);
34 }
35
36 pub fn define(self: *ToplevelContext, name: Symbol, expr: *PExpr) !void {
37 _ = try defineWithDocTrackChange(self, name, expr, null);
38 }
39
40 pub fn defineWithDoc(self: *ToplevelContext, name: Symbol, expr: *PExpr, doc: ?[]const u8) !void {
41 _ = try defineWithDocTrackChange(self, name, expr, doc);
42 }
43
44 pub fn defineWithDocTrackChange(self: *ToplevelContext, name: Symbol, expr: *PExpr, doc: ?[]const u8) !bool {
45 if (self.loading_stdlib) {
46 try self.definitions.defineStdlibWithDoc(name, expr, doc);
47 } else {
48 try self.definitions.defineWithDoc(name, expr, doc);
49 }
50 return false;
51 }