4 #include "system/stacktrace.h"
5 #include "system/nth_alloc.h"
7 #include "ebisp/interpreter.h"
8 #include "ebisp/expr.h"
9 #include "ebisp/scope.h"
11 #include "broadcast_lisp.h"
14 unknown_target(Gc *gc, const char *source, const char *target)
17 list(gc, "qqq", "unknown-target", source, target));
20 static struct EvalResult
21 send(void *param, Gc *gc, struct Scope *scope, struct Expr args)
27 Broadcast *broadcast = (Broadcast*) param;
29 struct Expr path = void_expr();
30 struct EvalResult result = match_list(gc, "e", args, &path);
31 if (result.is_error) {
35 return broadcast_send(broadcast, gc, scope, path);
43 Broadcast *create_broadcast(Game *game)
47 Broadcast *broadcast = nth_calloc(1, sizeof(Broadcast));
48 if (broadcast == NULL) {
52 broadcast->game = game;
57 void destroy_broadcast(Broadcast *broadcast)
59 trace_assert(broadcast);
64 broadcast_send(Broadcast *broadcast,
69 trace_assert(broadcast);
73 const char *target = NULL;
74 struct Expr rest = void_expr();
75 struct EvalResult res = match_list(gc, "q*", path, &target, &rest);
80 if (strcmp(target, "game") == 0) {
81 return game_send(broadcast->game, gc, scope, rest);
84 return unknown_target(gc, "game", target);
87 struct EvalResult broadcast_load_library(Broadcast *broadcast,
93 trace_assert(broadcast);
95 set_scope_value(gc, scope, SYMBOL(gc, "send-native"), NATIVE(gc, send, broadcast));
97 struct EvalResult result = eval_block(gc, scope, broadcast_lisp_library(gc));
98 if (result.is_error) {
102 return eval_success(NIL(gc));