Re: SRFI 105: Curly-infix-expressions David A. Wheeler 29 Aug 2012 18:54 UTC
Shiro Kawai: > I implemented curly-infix notation in Gauche and stated to give > it a try. And I can't help feeling c-exprs and s-exprs don't mix well. ... > Here I pasted some code: https://gist.github.com/3502491 > I took exiting code that used some math (and I remember I wished > to have had infix notation when I wrote them) and converted to C-exprs.... > I started itemizing why they don't mix, but before writing up > a lenghthy email, I'd better check with you if I'm not doing it wrong. I looked further at your pasted code (thanks for doing that). To be honest, I don't think it's terrible at all, I think it's an improvement from traditional s-expressions. From your description, and further looking, I'm guessing it's this kind of code you're unhappy about: (define (S0 λ N) (sum-ec (: n 1 N) {λ * (exp (- {n * λ})) * (- {2 ^^ (ceiling (log n 2))}) * n})) Again, I think this is a *BIG* improvement over traditional s-expressions. I think as infix expressions get long they're less helpful. Since you can CHOOSE when to use them, you can skip it, which is actually an *advantage* over many other languages with built-in infix. Try this: (define (S0 λ N) (sum-ec (: n 1 N) (* λ (exp (- {n * λ})) (- {2 ^^ (ceiling (log n 2))}) n))) Now that said, its inability to handle stuff of the form f(...), such as -(...), is a big drawback. We could add support for neoteric-expressions inside {...} to resolve that; it's an easy spec change, and that specification is mature. So let's see what that would do: (define (S0 λ N) (sum-ec (: n 1 N) {λ * exp(-({n * λ})) * -({2 ^^ ceiling(log(n 2))}) * n})) That's better. Again, kind of long for infix; try this: (define (S0 λ N) (sum-ec (: n 1 N) (* λ exp(-{n * λ}) -{2 ^^ ceiling(log(n 2))} n))) If you don't like the mixing of () and {}, well, we intentionally designed it so that when you have 0 and 1 parameters you can use either. That becomes (back to few lines): (define (S0 λ N) (sum-ec (: n 1 N) {λ * exp{-{{n * λ}}} * -{{2 ^^ ceiling(log(n 2))}} * n})) This compares favorably with full neoteric-expressions, which allow the use of f(x) for (f x) ANYWHERE: define( S0(λ N) sum-ec( (: n 1 N) {λ * exp{-{{n * λ}}} * -{{2 ^^ ceiling(log(n 2))}} * n})) Well, those are a lot of options. In *practice*, what I would do is switch to a NON-infix form once the expression gets to be more than half a line with complex expressions inside them (as shown above). So with curly-infix ONLY I'd do this (as shown above): (define (S0 λ N) (sum-ec (: n 1 N) (* λ (exp (- {n * λ})) (- {2 ^^ (ceiling (log n 2))}) n))) --- David A. Wheeler