| arc> a&~b
[ time passes ...]
^Cuser break
Sometimes my logic classes echo back at me from years past, and I feel compelled to write A and not B, or in arc terms, hopefully, a&~b. Here's an example: arc> ; a function to detect multiples of d
arc> (def m (d) (fn (n) (is (mod n d) 0)))
arc> ; odd numbers that are not multiples of 7.
arc> (map odd&~m.7 (range 5 9))
I would expect (t nil nil nil t), but it doesn't work! Arc just hangs.Here is a possible solution that simply demotes ~-ssyntax, so that &-ssyntax gets expanded before ~. I can't tell if it might break other stuff though: ; ac.scm
(define (expand-ssyntax sym)
((cond ((insym? #\: sym) expand-compose)
((or (insym? #\. sym) (insym? #\! sym)) expand-sexpr)
((insym? #\& sym) expand-and)
((insym? #\~ sym) expand-compose) ; ** demote complement **
; ((insym? #\_ sym) expand-curry)
(#t (error "Unknown ssyntax" sym)))
sym))
This is only a quick fix; I think part of the underlying problem is that expand-ssyntax triggers expand-compose if it detects "~" anywhere in the symbol, but expand-compose only expands "~" when it occurs at the beginning of the symbol. |