OpenCog Framework  Branch: master, revision 6f0b7fc776b08468cf1b74aa9db028f387b4f0c0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
SchemeEval.h
Go to the documentation of this file.
1 /*
2  * SchemeEval.h
3  *
4  * Scheme expression evaluator for OpenCog
5  * Copyright (c) 2008, 2014 Linas Vepstas <linas@linas.org>
6  */
7 
8 #ifndef OPENCOG_SCHEME_EVAL_H
9 #define OPENCOG_SCHEME_EVAL_H
10 #ifdef HAVE_GUILE
11 
12 #include <condition_variable>
13 #include <mutex>
14 #include <string>
15 #include <sstream>
16 #include <cstddef>
17 #include <libguile.h>
21 #include <opencog/util/exceptions.h>
22 
23 namespace opencog {
61 class AtomSpace;
62 
63 class SchemeEval : public GenericEval
64 {
65  private:
66  // Initialization stuff
67  void init(void);
68  static void * c_wrap_init(void *);
69  void per_thread_init(void);
70  void thread_lock(void);
71  void thread_unlock(void);
72 
73  // Destructor stuff
74  void finish(void);
75  static void * c_wrap_finish(void *);
76 
77  // Things related to (async) cogserver shell-evaluation
78  void do_eval(const std::string &);
79  std::string do_poll_result();
80  static void * c_wrap_eval(void *);
81  static void * c_wrap_poll(void *);
82  const std::string *pexpr;
83  std::string answer;
84  SCM _rc;
85  bool _eval_done;
86  bool _poll_done;
87  std::mutex _poll_mtx;
88  std::condition_variable _wait_done;
89  std::string poll_port();
90  SCM _pipe;
91  int _pipeno;
92 
93  // Output port, for any printing done by scheme code.
94  SCM _outport;
96  bool _in_shell;
97  bool _in_server;
99  void capture_port();
100  void redirect_output();
101  void restore_output();
102  void drain_output();
103 
104  // Straight-up evaluation
105  SCM do_scm_eval(SCM, SCM (*)(void *));
106  static void * c_wrap_eval_h(void *);
107  static void * c_wrap_eval_tv(void *);
108 
109  // Apply function to arguments, returning Handle or TV
110  Handle do_apply(const std::string& func, Handle& varargs);
111  SCM do_apply_scm(const std::string& func, Handle& varargs);
114  static void * c_wrap_apply(void *);
115  static void * c_wrap_apply_tv(void *);
116 
117  // Exception and error handling stuff
119  std::string error_msg;
120  void set_error_string(SCM);
122  void set_captured_stack(SCM);
123  static SCM preunwind_handler_wrapper(void *, SCM, SCM);
124  static SCM catch_handler_wrapper(void *, SCM, SCM);
125  SCM preunwind_handler(SCM, SCM);
126  SCM catch_handler(SCM, SCM);
127 
128  // Printing of basic types
129  static std::string prt(SCM);
130 
131  static void * c_wrap_set_atomspace(void *);
133  int _gc_ctr;
134  bool _in_eval;
135 
136  public:
137  // Call before first use.
138  static void init_scheme(void);
139 
140  // Set per-thread global
141  static void set_scheme_as(AtomSpace*);
142 
143  SchemeEval(AtomSpace* = NULL);
144  ~SchemeEval();
145 
146  // Return per-thread, per-atomspace singleton
147  static SchemeEval* get_evaluator(AtomSpace* = NULL);
148 
149  // The async-output interface.
150  void begin_eval();
151  void eval_expr(const std::string&);
152  std::string poll_result();
153 
154  // The synchronous-output interfaces.
155  std::string eval(const std::string& expr)
156  { begin_eval(); eval_expr(expr); return poll_result(); }
157  std::string eval(const std::stringstream& ss)
158  { return eval(ss.str()); }
159 
160  // Evaluate expression, returning handle.
161  Handle eval_h(const std::string&);
162  Handle eval_h(const std::stringstream& ss) { return eval_h(ss.str()); }
163 
164  // Evaluate expression, returning TV.
165  TruthValuePtr eval_tv(const std::string&);
166  TruthValuePtr eval_tv(const std::stringstream& ss) { return eval_tv(ss.str()); }
167 
168  // Apply expression to args, returning Handle or TV
169  Handle apply(const std::string& func, Handle varargs);
170  TruthValuePtr apply_tv(const std::string& func, Handle varargs);
171 
172  // Nested invocations
173  bool recursing(void) { return _in_eval; }
174 };
175 
176 
177 
179 }
180 
181 #endif/* HAVE_GUILE */
182 
183 #endif /* OPENCOG_SCHEME_EVAL_H */
void eval_expr(const std::string &)
Definition: SchemeEval.cc:490
static void * c_wrap_apply_tv(void *)
Definition: SchemeEval.cc:1088
Handle apply(const std::string &func, Handle varargs)
Definition: SchemeEval.cc:963
std::condition_variable _wait_done
Definition: SchemeEval.h:88
std::string error_msg
Definition: SchemeEval.h:119
void drain_output()
Discard all chars in the outport.
Definition: SchemeEval.cc:144
TruthValuePtr tvp
Definition: SchemeEval.h:113
std::shared_ptr< TruthValue > TruthValuePtr
Definition: TruthValue.h:85
static void init_scheme(void)
Definition: SchemeEval.cc:1197
static void * c_wrap_eval_tv(void *)
Definition: SchemeEval.cc:940
std::string poll_result()
Definition: SchemeEval.cc:523
std::string eval(const std::string &expr)
Definition: SchemeEval.h:155
static void * c_wrap_poll(void *)
Definition: SchemeEval.cc:516
const std::string * pexpr
Definition: SchemeEval.h:82
Handle eval_h(const std::stringstream &ss)
Definition: SchemeEval.h:162
SCM do_apply_scm(const std::string &func, Handle &varargs)
Definition: SchemeEval.cc:1025
static SchemeEval * get_evaluator(AtomSpace *=NULL)
Definition: SchemeEval.cc:1135
Handle eval_h(const std::string &)
Definition: SchemeEval.cc:858
static void * c_wrap_eval(void *)
Definition: SchemeEval.cc:529
SCM preunwind_handler(SCM, SCM)
Definition: SchemeEval.cc:383
std::string do_poll_result()
Definition: SchemeEval.cc:675
SCM catch_handler(SCM, SCM)
Definition: SchemeEval.cc:392
SchemeEval(AtomSpace *=NULL)
Definition: SchemeEval.cc:304
void set_captured_stack(SCM)
Definition: SchemeEval.cc:189
static void * c_wrap_finish(void *)
Definition: SchemeEval.cc:180
static SCM preunwind_handler_wrapper(void *, SCM, SCM)
Definition: SchemeEval.cc:371
void per_thread_init(void)
Definition: SchemeEval.cc:322
static void * c_wrap_set_atomspace(void *)
Definition: SchemeEval.cc:1180
TruthValuePtr apply_tv(const std::string &func, Handle varargs)
Definition: SchemeEval.cc:1053
static void * c_wrap_apply(void *)
Definition: SchemeEval.cc:991
void thread_lock(void)
Definition: SchemeEval.cc:281
std::string poll_port()
Definition: SchemeEval.cc:638
static void set_scheme_as(AtomSpace *)
Definition: SchemeEval.cc:1192
std::mutex _poll_mtx
Definition: SchemeEval.h:87
std::string eval(const std::stringstream &ss)
Definition: SchemeEval.h:157
static void * c_wrap_eval_h(void *)
Definition: SchemeEval.cc:890
AtomSpace * atomspace
Definition: SchemeEval.h:132
void set_error_string(SCM)
Definition: SchemeEval.cc:197
std::string answer
Definition: SchemeEval.h:83
void do_eval(const std::string &)
Definition: SchemeEval.cc:583
SCM do_scm_eval(SCM, SCM(*)(void *))
Definition: SchemeEval.cc:764
static SCM catch_handler_wrapper(void *, SCM, SCM)
Definition: SchemeEval.cc:377
bool recursing(void)
Definition: SchemeEval.h:173
static std::string prt(SCM)
Definition: SchemeEval.cc:343
TruthValuePtr eval_tv(const std::stringstream &ss)
Definition: SchemeEval.h:166
static void * c_wrap_init(void *)
Definition: SchemeEval.cc:150
TruthValuePtr eval_tv(const std::string &)
Definition: SchemeEval.cc:905
void thread_unlock(void)
Definition: SchemeEval.cc:292
Handle do_apply(const std::string &func, Handle &varargs)
Definition: SchemeEval.cc:1005