Skip to content

Commit

Permalink
compile-time evaluated special forms
Browse files Browse the repository at this point in the history
  • Loading branch information
adh committed Feb 4, 2013
1 parent 616f9d2 commit fb39f42
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 2 deletions.
2 changes: 2 additions & 0 deletions TODO
Expand Up @@ -15,6 +15,8 @@ nearterm:
- overriding of type methods
* Allow at least call-next-method in methods with C wrapper
* Futures
* batch compiler
- package API as special forms or something

Non-version-specific:
* More tests
Expand Down
8 changes: 6 additions & 2 deletions dfsch/types.h
Expand Up @@ -173,8 +173,9 @@ typedef struct dfsch_form_t dfsch_form_t;
/* methods used by compiler, in different struct for easier expansion */
typedef struct dfsch_form_methods_t {
dfsch_object_t* (*compile)(dfsch_form_t* form,
dfsch_object_t* expr,
dfsch_object_t* env);
dfsch_object_t* expr,
dfsch_object_t* env);
int compile_time_eval;
} dfsch_form_methods_t;

typedef dfsch_object_t* (*dfsch_form_impl_t)(dfsch_form_t* form,
Expand Down Expand Up @@ -213,6 +214,9 @@ extern dfsch_type_t dfsch_form_type;
#define DFSCH_FORM_COMPILE(name) \
.compile = form_##name##_compile

#define DFSCH_FORM_COMPILE_TIME \
.compile_time_eval = 1

#define DFSCH_DEFINE_FORM(name, meths, doc...) \
DFSCH_FORM_IMPLEMENTATION(name); \
static dfsch_form_t form_##name = { \
Expand Down
5 changes: 5 additions & 0 deletions src/compiler.c
Expand Up @@ -203,6 +203,11 @@ dfsch_object_t* dfsch_compile_expression(dfsch_object_t* expression,
if (operator_value != DFSCH_INVALID_OBJECT){
if (DFSCH_TYPE_OF(operator_value) == DFSCH_FORM_TYPE){
dfsch_form_t* form = ((dfsch_form_t*)operator_value);

if (form->methods.compile_time_eval){
form->impl(form, env, args, NULL);
}

if (form->methods.compile){
res = form->methods.compile(operator_value, expression, env);
} else {
Expand Down

0 comments on commit fb39f42

Please sign in to comment.