Miscellaneous comments John Cowan (16 Aug 2015 01:05 UTC)
Re: Miscellaneous comments taylanbayirli@xxxxxx (16 Aug 2015 13:21 UTC)
Re: Miscellaneous comments John Cowan (16 Aug 2015 14:04 UTC)
Re: Miscellaneous comments taylanbayirli@xxxxxx (16 Aug 2015 16:29 UTC)
Re: Miscellaneous comments taylanbayirli@xxxxxx (16 Aug 2015 19:50 UTC)
Re: Miscellaneous comments taylanbayirli@xxxxxx (17 Aug 2015 08:21 UTC)

Re: Miscellaneous comments taylanbayirli@xxxxxx 16 Aug 2015 13:21 UTC

John Cowan <xxxxxx@mercury.ccil.org> writes:

> I don't like using set!, because (set! x y z) depends on the current
> value of x, whereas (set! x y) ignores the current value.  Using set
> (with no !) might be better.

I don't think dropping the ! is a good idea, since it dispatches to a
variety of *-set! procedures and is clearly mutative.

While there's kind of a conceptual inconsistency between the two- and
three-argument uses of set!, I think this is unlikely to lead to
confusion in practice.

Input from more people welcome.  Also see last part of this mail though.

> The opaque records of R6RS and SRFI 99 extensions should be explicitly
> excluded from this SRFI.

The SRFI doesn't really use any form of inspection into record types.
It just piggybacks `define-record-type' to take note of the newly
defined data type, and create tables mapping symbols to the data type's
accessors and modifiers.  So I think it's fine to support them.

Or am I missing something?

> If SRFI-4 homogeneous vectors are supported by the implementation,
> this SRFI should require that they be supported here too.

Indeed.  I'll specify that, and add support for it in the reference
implementation.

> It would be easy to allow default arguments for all types of refs,
> and I think that should be done, for convenience and uniformity.

I would rather reserve that feature for types which may have fields that
"exist" but hold no value.  (In this sense, hashtables have infinitely
many fields; you get the idea.)  It's natural for those types, whereas
using (ref #(0 1 2) 3 'default) as a shorthand for a bounds-check and
fallback value is a rather obscure abbreviation, and for record types
it's even more strange.  Those are more likely to be programmer errors
than anything else, I imagine.

More views welcome.

> Supporting a SRFI-17 setter for ref makes sense, but I think
> (set! (car foo) bar quux) is even more confusing than (set! foo bar
> quux).

While I don't find (set! foo bar quux) particularly confusing, I have to
admit (set! (car foo) bar quux) is a worrying one.  Although, I'm not
sure whether it would lead to actual problems.  It's unlikely that one
would write a bug due to the confusion, and someone reading the code
should suffer from a mild irritation at most, which in turn can be
salvaged by let-binding (car foo) first to make the code clearer.
(There are many ways to write irritating code!)

For now, I don't see it as a show-stopper to support 3-argument set!,
however with Mark Weaver's input on IRC I began pondering on making the
whole design closer to (or at least incorporating the one of) Gauche's
ref* AKA ~ operator.  That, plus I just realized I could support pairs
distinctly from lists by testing the field argument with `procedure?'
(meaning it can't be a list index, and is likely to be car/cdr), so your
example would more idiomatically become

(set! (~ foo car bar) quux),

where (set! structure key value) is still kept for the simplest cases,
because in my opinion it's nicer than (set! (~ structure key) value).
Having to type the extra parentheses and tilde for the arguably most
common use case is, in my opinion, a no-no, and I see no harm in
continuing to support the 3-argument variant.

I could be fooling myself because I'm demotivated to trash too much of
the initial design though, which I came to like.

What do others think?

Should it be fine to support (set! obj key val) as a special-case as a
synonym to (set! (~ obj key) val), once the latter is supported for
arbitrary key-chains?  Or is it likely to do more harm than good?

Thanks for all the input so far!

Taylan