00001
00002
00004
00005 #define foreach(v, container) \
00006 for(::dynamic::var v, v##_enumerator=var(container).enumerator(); \
00007 v##_enumerator && (v=*v##_enumerator,true); \
00008 ++v##_enumerator)
00009
00010
00012 namespace dynamic
00013 {
00015
00016 const var null;
00017
00019
00020 DYNAMIC_API var global();
00021
00023
00024 DYNAMIC_API var version();
00025
00027
00028 DYNAMIC_API var stack_trace();
00029
00030 namespace internal
00031 {
00032 DYNAMIC_API var create_closure(const var & object, const char * method, const var & fn);
00033 template<typename Fn> DYNAMIC_API var function(Fn);
00034 DYNAMIC_API var named_functor(const var & fn, const char * name);
00035 DYNAMIC_API var bind(int args);
00036 DYNAMIC_API var create_string(const char*);
00037 DYNAMIC_API var create_string(const std::string & str);
00038 DYNAMIC_API var create_string(const wchar_t*);
00039 DYNAMIC_API var create_string(const wstring & str);
00040 DYNAMIC_API string to_string(const var & v);
00041 DYNAMIC_API wstring to_wstring(const var & v);
00042 DYNAMIC_API bool register_function(const char * name, void * address);
00043 DYNAMIC_API void * lookup_function(const char * name);
00044 DYNAMIC_API const char * lookup_function(void * address);
00045 DYNAMIC_API var proxy(const var & v);
00046 DYNAMIC_API var proxy(const var & v, apartment * prev);
00047 }
00048
00050
00051 DYNAMIC_API var bind(const var & fn, const var & arg);
00052 DYNAMIC_API var bind(const var & fn, const var & a0, const var & a1);
00053 DYNAMIC_API var bind(const var & fn, const var & a0, const var & a1, const var & a2);
00054 DYNAMIC_API var bind(const var & fn, const var & a0, const var & a1, const var & a2, const var & a3);
00055 DYNAMIC_API var bind(const var & fn, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4);
00056 DYNAMIC_API var bind(const var & fn, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5);
00057 DYNAMIC_API var bind(const var & fn, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6);
00058 DYNAMIC_API var bind(const var & fn, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7);
00059 DYNAMIC_API var bind(const var & fn, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8);
00060 DYNAMIC_API var bind(const var & fn, const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8, const var & a9);
00061
00063
00064 DYNAMIC_API var object();
00065
00067
00068 DYNAMIC_API var object(const char * class_name);
00069
00071
00072 DYNAMIC_API var string_from(const var & container);
00073
00075
00076 template<typename FwdIterator>
00077 var string_it(FwdIterator from, FwdIterator to)
00078 {
00079 var result = "";
00080 for(FwdIterator i=from; i!=to; ++i) result.push_back(*i);
00081 return result;
00082 }
00083
00085
00086 DYNAMIC_API std::string pickle(const var &);
00087
00089
00090 DYNAMIC_API var unpickle(const std::string&);
00091
00093
00094 DYNAMIC_API var tail(const var & container);
00095
00097
00098 DYNAMIC_API var map();
00099
00101
00102 DYNAMIC_API var map(const var & key, const var & value);
00103
00105
00106 DYNAMIC_API var set();
00107
00109
00110 DYNAMIC_API var set(const var&);
00111
00113
00114 DYNAMIC_API var set(const var&, const var&);
00115
00117
00118 DYNAMIC_API var set(const var&, const var&, const var&);
00119
00121
00122 DYNAMIC_API var set(const var&, const var&, const var&, const var&);
00123
00125
00126 DYNAMIC_API var set(const var&, const var&, const var&, const var&, const var&);
00127
00129
00130 DYNAMIC_API var set(const var&, const var&, const var&, const var&, const var&, const var&);
00131
00133
00134 DYNAMIC_API var set(const var&, const var&, const var&, const var&, const var&, const var&, const var&);
00135
00137
00138 DYNAMIC_API var set(const var&, const var&, const var&, const var&, const var&, const var&, const var&, const var&);
00139
00141
00142 DYNAMIC_API var set(const var&, const var&, const var&, const var&, const var&, const var&, const var&, const var&, const var&);
00143
00145
00146 DYNAMIC_API var set(const var&, const var&, const var&, const var&, const var&, const var&, const var&, const var&, const var&, const var&);
00147
00149
00150 DYNAMIC_API var set_from(const var & container);
00151
00153
00154 template<typename FwdIterator>
00155 var set_it(FwdIterator start, FwdIterator end)
00156 {
00157 var r = set();
00158 for(FwdIterator i=start; i!=end; ++i) r.insert(*i);
00159 return r;
00160 }
00161
00163
00164 DYNAMIC_API var fill_array(const var & size, const var & item);
00165
00167
00168 DYNAMIC_API var array();
00169
00171
00172 DYNAMIC_API var array(const var &);
00173
00175
00176 DYNAMIC_API var array(const var &, const var&);
00177
00179
00180 DYNAMIC_API var array(const var &, const var&, const var&);
00181
00183
00184 DYNAMIC_API var array(const var &, const var&, const var&, const var&);
00185
00187
00188 DYNAMIC_API var array(const var &, const var&, const var&, const var&, const var&);
00189
00191
00192 DYNAMIC_API var array(const var &, const var&, const var&, const var&, const var&, const var&);
00193
00195
00196 DYNAMIC_API var array(const var &, const var&, const var&, const var&, const var&, const var&, const var&);
00197
00199
00200 DYNAMIC_API var array(const var &, const var&, const var&, const var&, const var&, const var&, const var&, const var&);
00201
00203
00204 DYNAMIC_API var array(const var &, const var&, const var&, const var&, const var&, const var&, const var&, const var&, const var&);
00205
00207
00208 DYNAMIC_API var array(const var &, const var&, const var&, const var&, const var&, const var&, const var&, const var&, const var&, const var&);
00209
00211
00212 DYNAMIC_API var array_from(const var &);
00213
00215
00216 template<typename It>
00217 var array_it(It a, It b)
00218 {
00219 var l = array();
00220 l.impl().reserve(std::distance(a,b));
00221 for(It i=a; i!=b; ++i)
00222 l.push_back(*i);
00223 return l;
00224 }
00225
00227
00228 template<std::size_t N>
00229 var array(var (&l)[N])
00230 {
00231 var a = array();
00232 a.impl().reserve(N);
00233 for(std::size_t i=0; i<N; ++i) a.push_back(l[i]);
00234 return a;
00235 }
00236
00238
00239 DYNAMIC_API var list();
00240
00242
00243 DYNAMIC_API var fill_list(const var & size, const var & item);
00244
00246
00247 template<typename It>
00248 var list_it(It a, It b)
00249 {
00250 var l = list();
00251 for(It i=a; i!=b; ++i)
00252 l.push_back(*i);
00253 return l;
00254 }
00255
00257
00258 DYNAMIC_API var list(const var & item);
00259
00261
00262 DYNAMIC_API var list(const var &, const var &);
00263
00265
00266 DYNAMIC_API var list(const var &, const var &, const var &);
00267
00269
00270 DYNAMIC_API var list(const var &, const var &, const var &, const var &);
00271
00273
00274 DYNAMIC_API var list(const var &, const var &, const var &, const var &, const var &);
00275
00277
00278 DYNAMIC_API var list(const var &, const var &, const var &, const var &, const var &, const var &);
00279
00281
00282 DYNAMIC_API var list(const var &, const var &, const var &, const var &, const var &, const var &, const var &);
00283
00285
00286 DYNAMIC_API var list(const var &, const var &, const var &, const var &, const var &, const var &, const var &, const var &);
00287
00289
00290 DYNAMIC_API var list(const var &, const var &, const var &, const var &, const var &, const var &, const var &, const var &, const var &);
00291
00293
00294 DYNAMIC_API var list(const var &, const var &, const var &, const var &, const var &, const var &, const var &, const var &, const var &, const var &);
00295
00297
00298 DYNAMIC_API var list_from(const var & container);
00299
00301
00302 template<std::size_t N>
00303 var list(var (&ca)[N])
00304 {
00305 var l = list();
00306 for(std::size_t i=0; i<N; ++i) l.push_back(ca[i]);
00307 return l;
00308 }
00309
00311
00312 DYNAMIC_API var range(const var & from, const var & to);
00313
00315
00316 DYNAMIC_API var range(const var & from, const var & to, const var & step);
00317
00319
00320 DYNAMIC_API var range_ex(const var & from, const var & to);
00321
00323
00324 DYNAMIC_API var range_ex(const var & from, const var & to, const var & step);
00325
00327
00328 DYNAMIC_API var sequence(const var & start, const var & len);
00329
00331
00332 DYNAMIC_API var sequence(const var & start, const var & len, const var & step);
00333
00335
00336 DYNAMIC_API var reverse(const var &);
00337
00339
00340 DYNAMIC_API var filter(const var & container, const var & pred);
00341
00343
00344 DYNAMIC_API var transform(const var & container, const var & fn);
00345
00347
00348 DYNAMIC_API var dispatcher(const var & object);
00349
00351
00352 DYNAMIC_API var max(const var &a, const var & b);
00353
00355
00356 DYNAMIC_API var min(const var &a, const var & b);
00357
00359
00360 DYNAMIC_API var open_file(const var & filename, std::ios_base::openmode flags);
00361
00363
00364 DYNAMIC_API var write_file(const var & filename);
00365
00367
00368 DYNAMIC_API var read_file(const var & filename);
00369
00371
00372 DYNAMIC_API var fstat(const var & filename);
00373
00375
00376 DYNAMIC_API var in();
00377
00379
00380 DYNAMIC_API var out();
00381
00383
00384 DYNAMIC_API var err();
00385
00387
00388 DYNAMIC_API var mem_file();
00389
00391
00392 DYNAMIC_API var characters(const var & file);
00393
00395
00396 DYNAMIC_API var lines(const var & file);
00397
00399
00400 DYNAMIC_API var enumerate(const var & fn);
00401
00403
00404 DYNAMIC_API void write(const var &);
00405
00407
00408 DYNAMIC_API void writeln(const var&);
00409
00411
00412 DYNAMIC_API void writeln();
00413
00415
00416 DYNAMIC_API var readln();
00417
00419
00420 DYNAMIC_API var read_file(const var & file);
00421
00423
00424 DYNAMIC_API void pickle_file(const var & name, const var & object);
00425
00427
00428 DYNAMIC_API var unpickle_file(const var & name);
00429
00431
00432 DYNAMIC_API void sleep(const var & seconds);
00433
00435
00436 DYNAMIC_API var system(const var&);
00437
00439
00440 DYNAMIC_API var thread(const var & thread_fn);
00441
00443
00444 DYNAMIC_API var global(const var & fn);
00445
00447
00448 DYNAMIC_API var shared(const var & fn);
00449
00451
00452 DYNAMIC_API var event();
00453
00455
00456 DYNAMIC_API var mutex();
00457
00459
00460 DYNAMIC_API var exec(const var & file, const var & args);
00461
00463
00464 DYNAMIC_API var queue();
00465
00467
00468 DYNAMIC_API var message_queue(const var & consumer, const var & threads=1);
00469
00471
00472 DYNAMIC_API var substring(const var & str, const var & range);
00473
00475
00476 DYNAMIC_API var split_chars(var predicate, var str);
00477
00479
00480 DYNAMIC_API var string_find(const var & str, const var & needle);
00481
00483
00484 DYNAMIC_API var string_find_last(const var & str, const var & needle);
00485
00487
00488 DYNAMIC_API var string_find_all(const var & str, const var & needle);
00489
00491
00492 DYNAMIC_API var pad(const var & str, const var & size);
00493
00495
00496 DYNAMIC_API var is_space(var ch);
00497
00499
00500 DYNAMIC_API var is_one_of(var str, var ch);
00501
00503
00504 DYNAMIC_API var is_not_one_of(var str, var ch);
00505
00507
00508 DYNAMIC_API var is_not(var predicate, var value);
00509
00511
00512 DYNAMIC_API var varargs(const var & fn);
00513
00515
00519 #define finally(F) ::dynamic::scopeguard guard##__COUNTER__(F);
00520
00522
00523 class DYNAMIC_API scopeguard : cg::not_copyable, cg::not_assignable
00524 {
00526 var m_on_exit;
00527 public:
00529 scopeguard(const var & v);
00530
00532 ~scopeguard();
00533
00535 void dismiss();
00536
00538 void set(const var &);
00539 };
00540
00542 #define enable_pickle(F) static bool script_register_##F = ::dynamic::internal::register_function(#F, (void*)&F);
00543
00545
00546 DYNAMIC_API void gc_enable();
00547
00549
00550 DYNAMIC_API void gc_disable();
00551
00553
00554 DYNAMIC_API void gc_hint_collect();
00555
00557
00558 DYNAMIC_API void gc_force_collect();
00559
00561
00564 DYNAMIC_API void gc_tune( int heap_factor=30, int idle_factor=20, int min_objects=1000 );
00565
00567
00568 DYNAMIC_API void assertx(const var & v);
00569
00571
00572 DYNAMIC_API var run_tests(const var & tests);
00573
00575
00576 DYNAMIC_API double timer();
00577
00579 template<typename T>
00580 var create_impl(const T & t)
00581 {
00582 return var(t, var::assign_impl());
00583 }
00584 }