4 points by fallintothis 3502 days ago | link | parent If you want it, I wrote ssexpand-all for http://arclanguage.org/item?id=11179 and handled quotes, plus another edge case that leads to infinite loops:`````` arc> (ssyntax 'a~b) t arc> (ssexpand 'a~b) a~b `````` http://bitbucket.org/fallintothis/contract/src/tip/test/ssyn...
 1 point by evanrmurphy 3498 days ago | link It appears I've reinvented a worse version of your wheel. ^_^Your ssexpand-all is superior and I'm using it now. I did try to refactor it, thinking there must be a function f (like my ssexpandif but more sophisticated) that satisfies`````` (treewise cons f expr) `````` while producing the same functionality, but I haven't been able to determine what that would be.-----
 4 points by fallintothis 3498 days ago | link thinking there must be a function f (like my ssexpandif but more sophisticated)Not quite. The problem here is not f (entirely), but also treewise.`````` (def treewise (f base tree) (if (atom tree) (base tree) (f (treewise f base (car tree)) (treewise f base (cdr tree))))) `````` treewise will only act on atoms, whereas we need to act on conses sometimes -- namely, quoted items. If we ignore those, it could work:`````` (def ssexpand-all (expr) (treewise cons [let expanded (ssexpand-if expr) (if (is _ expanded) _ (ssexpand-all expanded))] expr)) `````` But ssyntax can expand into more ssyntax; e.g.,`````` arc> (ssexpand 'a:.b) (compose a .b) arc> (ssexpand '.b) (get b) `````` So, we need to recurse in the f argument anyway. At a certain point, it seems like the anonymous & higher-order functions add layers of indirection on what should just be a straightforward recursive definition.I get really annoyed at that, though, when working with trees in Arc. There always seems to be some underlying pattern that's just different enough that I can't abstract it into a higher-order function.-----