Hello, i'm facing sometimes recursively the problem to have definitions in expression context, which i manage every time by adding an upper empty (let () my definitions goes here ) the last case i was facing this probleme is defining a 'for macro:
;; scheme@(guile-user)> (for ({i <+ 0} {i < 5} {i <- {i + 1}}) (display i) (newline)) ;; 0 ;; 1 ;; 2 ;; 3 ;; 4 (define-syntax for (syntax-rules () ((_ (init test incrmt) b1 ...) (let () init (let loop () (when test b1 ... incrmt (loop))))))) this one fails in my Scheme+ code below: (define (compute-carries n) (for ( {k <+ 0} {k <= n} {k <- {k + 1}} ) { Ckp1 <+ (compute-Ck-plus1 k) } (display-nl Ckp1))) because { Ckp1 <+ (compute-Ck-plus1 k) } expands in : (define Ckp1 (compute-Ck-plus1 k)) and i get a compilation error: ;;; Syntax error: ;;; logic-syracuse+.scm:15:7: definition in expression context, where definitions are not allowed, in form (define Ckp1 (compute-Ck-plus1 k)) so i replace my 'for macro definition with: (define-syntax for (syntax-rules () ((_ (init test incrmt) b1 ...) (let () init (let loop () (when test (let () b1 ... incrmt (loop)))))))) and it works, but you will notice an abusive use of empty (let () ...) in the code to avoid the restrictions of definitions not allowed in expression context. My ideas is as it is so easy to cheat the compiler from seeing the expressio context why does the compiler restrict this? expression and defintion context, i'm not sure they are in scheme standarts, are they really usefull? why not remove this from Scheme at all? Regards, Damien