Alan Manuel Gloria:
> Consider the following syntax:
> {x ,op y}
>
> The "simple" curly-infix rules require that the even parameter be a
> *symbol*. So the above syntax becomes (nfx x ,op y).
>
> But a user might consider {<x> <y> <z>} to be (<y> <x> <z>),
> regardless of what our specs says, simply because every '{<x> <y> <z>}
> he or she reasonably tries turns into '(<y> <x> <z>).
>
> Thus, the user *might* reasonably expect {x ,op y} to be (,op x y)
Hmm. I intentionally didn't go there, but that doesn't mean I was *right*. I
had presumed that if you wanted a more complex operation, you'd switch to
prefix notation. But I hadn't thought about ,op... which is actually plausible.
> This approach gets problems though.
>
> 1. Is this "special" case reserved only for 3-element lists (i.e. we
> have a "binary" curly-infix notation where {x y z} is (y x z) for all
> y)? Then the case, when extended {x ,op y ,op z} suddenly becomes
> (nfx x ,op y ,op z)
If we do this at all, we should *NOT* limit it to 3-element cases. It'd be
confusing, and there's no reason to limit it.
> 2. Is this special case an extension for "simple" curly-infix
> notation, where we drop the "symbol" requirement and compare with....
> what? equal? Then it seems to invite abuse of the form {x (lambda (x
> y) (+ x y)) y (lambda (x y) (+ x y)) z}
Yes, I think "equal?" is the only reasonable equality test. Neither "eq?" nor
"eqv?" will do what you want if you want to allow ",op".
I don't think we have to worry about abuse. Any general construct can be
abused. I do worry about error detection - it's nice to automatically detect
errors when you can. But it's not clear that allowing ,op as an operator is an
error.
> Hmm....
>
> Maybe this is just an edge case we're better off not wasting our time with....
Maybe. I had thought about lambda, etc., and couldn't imagine anyone wanting
to do that. But ",op" is actually reasonable.
One problem I see is that "equal?" can fail to terminate if its arguments are
circular data structures. If a user provides data structures to a reader that
are circular data structures, and then invokes a 5+ parameter curly-infix list,
they can cause the reader to hang when reading data (not just programs).
That's a potential denial-of-service attack that is not very nice.. programs
use read() for data, not just for programs. R7RS is even creating ways for
users to provide circular data structures to the reader (!).
Other than that, it's more general, it makes the spec slightly simpler (we
don't have to check for the symbol), it's trivial to do in the implementation,
and it won't really matter performance-wise. It's a crazy idea that seems less
crazy on a second glance.
How about another equality operator? Let's call it it "eqop?". For non-pairs,
it's eqv?. We then decide what it means for pairs; the easy one is that their
car and cdr must be eqv?. That won't let you do lambda, but it'll allow ,op.
We could even allow for some bound (say, 4 levels deep) if that's not enough.
I'm game. It doesn't prevent anything we already do, and it allows some
generalizations that make sense. It also allows some crazy things, but it
would be the developer who did the crazy things :-).
Anyone screaming in horror?
Let's wait a day or two to discuss this through. If we're going to do this at
all, I'd like to put them in both the curly-infix SRFI and for version 0.5.
--- David A. Wheeler
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Readable-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/readable-discuss