Nikita Karetnikov <[email protected]> writes: > I think this example [1,2]: > > (define-syntax my-or > (syntax-rules () > ((my-or) > #t) > ((my-or exp) > exp) > ((my-or exp rest ...) > (let ((t exp)) > (if exp > exp > (my-or rest ...)))))) > > should look like this: > > (define-syntax my-or > (syntax-rules () > ((my-or) > #t) > ((my-or exp) > exp) > ((my-or exp rest ...) > (let ((t exp)) > (if t ; <- > t > (my-or rest ...))))))
Indeed, thanks! I've pushed this fix to the stable-2.0 branch, and am closing this bug. Answers to your other questions follow. > AFAICT, it's described here [3], but Guile is not affected, right? > [3] http://stackoverflow.com/a/3215238 That post gives an example that looks superficially similar, but is actually entirely different: (define remove! (let ((null? null?) (cdr cdr) (eq? eq?)) (lambda ... function that uses null?, cdr, eq? ...) Indeed, this is not necessary in Guile due to its module system. > So the following works as well: > > (define-syntax my-or > (syntax-rules () > ((my-or) > #t) > ((my-or exp) > exp) > ((my-or exp rest ...) > (if exp > exp > (my-or rest ...))))) The above definition has a problem: it would result in 'exp' being evaluated more than once, unless it returns false. For example, if you used your proposed definition above, (my-or (read) 5) would expand to: (if (read) (read) 5) Which would obviously not do what you expect from 'or'. Instead, we want: (let ((t (read))) (if t t 5)) > Note that 'my-or' is used in several places (e.g., [4]) and it's > necessary to change them all. > [4] https://gnu.org/software/guile/manual/guile.html#Syntax-Case Unless I'm mistaken, the Syntax-case section uses 'my-or', but does not define it, so I don't think anything needs to be fixed there. Right? Thanks, Mark
