* libguile/eval.c (s_macro_keyword): New static identifier.
(scm_m_define): Change order to first create binding and
evaluating the expression afterwards.
(scm_m_set_x): Memoize complete set! expression. Only leave
symbols if no binding exists at memoization time. Throw error if
assigning to a syntactic keyword.
(lazy_memoize_variable): New function.
(CEVAL): When execution set!, perform lazy memoization if
unmemoized symbol is detected.
* libguile/modules.c (module_variable): Return variables with
unbound value.
* libguile/tags.h: Fix comment.
* test-suite/tests/syntax.test: Add test case to check the correct
handling of define expressions.