#ifndef PSYC_H #define PSYC_H /* psyc.h: Unlike other files in this directory, this file is licensed under * the MIT license as documented in detail in ../psyc/LICENSE. */ #ifndef PSYC_LIST_SIZE_LIMIT # define PSYC_LIST_SIZE_LIMIT 404 #endif #ifdef SPYC # define C_GLYPH_PACKET_DELIMITER '|' # define S_GLYPH_PACKET_DELIMITER "|" #else # define C_GLYPH_PACKET_DELIMITER '.' # define S_GLYPH_PACKET_DELIMITER "." #endif #define C_GLYPH_SEPARATOR_KEYWORD '_' #define S_GLYPH_SEPARATOR_KEYWORD "_" #define C_GLYPH_MODIFIER_SET ':' #define S_GLYPH_MODIFIER_SET ":" #define C_GLYPH_MODIFIER_ASSIGN '=' #define S_GLYPH_MODIFIER_ASSIGN "=" #define C_GLYPH_MODIFIER_AUGMENT '+' #define S_GLYPH_MODIFIER_AUGMENT "+" #define C_GLYPH_MODIFIER_DIMINISH '-' #define S_GLYPH_MODIFIER_DIMINISH "-" #define C_GLYPH_MODIFIER_QUERY '?' #define S_GLYPH_MODIFIER_QUERY "?" #define PSYC_ROUTING 1 #define PSYC_ROUTING_MERGE 2 #define PSYC_ROUTING_RENDER 4 // I thought about changing all occurrencies of these chars in parse.i // but it only makes parse.i less readable and changes of these // modifiers are just not to be expected. It is however recommended // to use these macros if you look at the psyc syntax anywhere outside // the core psyc parser, like when splitting methods by '_'. // // here are the macros to implement method inheritance in a loop around // a switch (see http://about.psyc.eu/Inheritance and "try and slice") // changes for try/slice are so profound in some parts, that running with it // disabled is actually more "experimental" and flaky. PSYC_TRY() is also // used for varnames in spyc/dispatch.i, so it's not just the methods here. #ifndef _flag_disable_inheritance_method # if DEBUG > 1 # define PSYC_SLICE_DEBUG \ log_file("SLICE", "%s:%O slicing %O in %O\n", \ __FILE__, __LINE__, family, ME); # else # define PSYC_SLICE_DEBUG # endif # define PSYC_TRY(mc) \ family = mc; \ while (family) { \ glyph = -4; \ switch(family) # define PSYC_SLICE_AND_REPEAT \ default: \ PSYC_SLICE_DEBUG \ glyph = rmember(family, C_GLYPH_SEPARATOR_KEYWORD); \ if (glyph > 1) family = family[.. glyph-1]; \ else family = 0; \ } \ if (glyph == -4) family = 0; // got here by break; #else # define PSYC_TRY(mc) switch(mc) # define PSYC_SLICE_AND_REPEAT #endif #endif /* PSYC_H */