Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Gabriel Scherer <gabriel.scherer@gmail.com>
To: Nils Becker <nils.becker@bioquant.uni-heidelberg.de>
Cc: caml users <caml-list@inria.fr>
Subject: Re: [Caml-list] destructive local opens
Date: Mon, 17 Aug 2015 16:26:22 +0200	[thread overview]
Message-ID: <CAPFanBG+905eK9PuU_bCPBqH5S4zesOsUo7-=xT+Xe8iRQKRVw@mail.gmail.com> (raw)
In-Reply-To: <55D1B49C.2040309@bioquant.uni-heidelberg.de>

> For ease of reasoning I think it may be a good idea to make M.(...) and
> M.!(...) behave in exactly the same way as let open and let open!
> respectively, including error messages. This would probably forbid
> distinguishing between infix operators and the rest.


Indeed, I don't think anyone planned to have (let open{,!} M in ...)
behave differently from M.{!,}(...). In fact I don't think there is
any distinction between those two constructions at the level of typing
derivations (except maybe as on-the-side annotation for
pretty-printing), so it is natural to handle them in exactly the same
way.

I proposed an implementation of the distinction between operators and
alphanumeric identifiers in
  Shadow warnings: 44 refined into 52,53 for alphanumeric identifiers
and symbolic operators
  https://github.com/ocaml/ocaml/pull/232
and this is orthogonal to the question of whether to add M.!(...), for
which a patch was proposed by Gabriel Radanne in
  Short syntax for overriding local open
  https://github.com/ocaml/ocaml/pull/218

I am of the opinion that, whether we decide to introduce M.!(...) or
not (this looks like a good idea for consistency), both (let open!)
and M.!(...) are dangerous constructions that should be avoided
whenever possible, and that we could and should drastically reduce the
number of situations where the user is encouraged to use them.

(Another idea I had was to write !<pattern>, which would have the same
semantics as <pattern>, except that it claims that the identifiers
bound in <pattern> shadow identifiers in scope. I find this syntax
cute, but the symmetry with ((!) : 'a ref -> 'a) is troubling in a bad
way.)

On Mon, Aug 17, 2015 at 12:17 PM, Nils Becker
<nils.becker@bioquant.uni-heidelberg.de> wrote:
> Sorry for the late comment.
>
> The mentioned bug:
>
>> let ox = V2.((dot v ox) * ox) in
>> V2.(3 * ox + oy)
>
> because V2 also has V2.ox sure is nasty. But the same would happen with
> a local 'let open V2'.
>
> let ox =
>     let open V2 in
>     (dot v ox) * ox in
> V2.(3 * ox + oy)
>
> For ease of reasoning I think it may be a good idea to make M.(...) and
> M.!(...) behave in exactly the same way as let open and let open!
> respectively, including error messages. This would probably forbid
> distinguishing between infix operators and the rest.
>
> (Admittedly, in the latter example one would be tempted to combine the
> local opens here which would make things clearer)
>
>> The reality is that M.() is inherently dangerous,
>
> When one uses a (destructive) local open one trades the possibility of
> ambiguity for conciseness. In a few cases the conciseness is really,
> really important, so that this trade-off is worth it. (I'm thinking
> about math.) The existence of let open! in the language says that there
> is some consensus that ambiguity is sometimes acceptable.
>
>
>>    The benefit is that I can understand what is happening by only
>> looking at the
>>    expression I'm reading. With your proposal I also need to go read
>> the library
>>    source to understand what is happening.
>
> It's not that bad. Destructive opens mean one has to know the shadowing
> module's signature. Only the values exported in the signature actually
> shadow anything (I just tried it out) so one does _not_ need to know the
> module source!
>
> Right now, one cannot really use M.(...) to shadow without deactivating
> warning 44. This is not ideal. With the syntax M.!(...) one would be
> forced to declare shadowing intent and 44 could be switched on. Then
>
> let ox = V2.!((dot v ox) * ox) in
> V2.!(3 * ox + oy)
>
> would still let the same bug happen but at least one was forced to write
> an exclamation mark which should give a feeling of "be careful about
> shadowing here!". Would this not be enough?
>
>
> n.
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs

  reply	other threads:[~2015-08-17 14:27 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-17 10:17 Nils Becker
2015-08-17 14:26 ` Gabriel Scherer [this message]
2015-08-17 15:11   ` Nils Becker
2015-08-17 15:17     ` Drup
2015-08-17 15:18     ` Gabriel Scherer
2015-08-17 18:31       ` Hendrik Boom
  -- strict thread matches above, loose matches on Subject: below --
2015-08-03 13:39 Nils Becker
2015-08-03 13:43 ` Thomas Refis
2015-08-03 13:45 ` Daniel Bünzli
2015-08-03 13:47   ` Daniel Bünzli
     [not found]     ` <55BF75F6.1040006@bioquant.uni-heidelberg.de>
2015-08-03 14:24       ` Daniel Bünzli
2015-08-03 14:37         ` Gabriel Scherer
2015-08-03 14:43           ` Daniel Bünzli
2015-08-03 15:10           ` octachron
2015-08-03 15:22             ` Daniel Bünzli
2015-08-03 16:13               ` octachron
2015-08-03 16:51                 ` Daniel Bünzli
2015-08-03 17:18                   ` Hendrik Boom
2015-08-03 17:59                   ` octachron
2015-08-04  6:51         ` Petter Urkedal
2015-08-04  9:33           ` Goswin von Brederlow
2015-08-05  6:40             ` Petter A. Urkedal
2015-08-05 10:16               ` David Allsopp
2015-08-06  9:35               ` Goswin von Brederlow
2015-08-04 13:50           ` Hendrik Boom
2015-08-04  9:26         ` Goswin von Brederlow
2015-08-04  9:38           ` Daniel Bünzli
2015-08-04 12:26             ` vrotaru.md
2015-08-04 13:12               ` David Allsopp
2015-08-04 13:17                 ` Jeremy Yallop
2015-08-04 13:54                   ` vrotaru.md
2015-08-04 15:25                   ` Drup
2015-08-04 22:22                     ` vrotaru.md
2015-08-04 22:55                       ` Hendrik Boom
2015-08-05  4:52                         ` Gabriel Scherer
2015-08-04 13:14               ` Ivan Gotovchits
2015-08-14 10:55                 ` Goswin von Brederlow
2015-08-14 11:28                   ` Drup
2015-08-18 11:11                     ` Goswin von Brederlow
2015-08-18 12:52                       ` David Allsopp
2015-08-18 13:00                         ` Gabriel Scherer
2015-08-18 22:26                           ` Anthony Tavener
2015-08-19 13:55                             ` Oleg
2015-08-19 14:13                               ` John Whitington
2015-08-19 15:47                                 ` Hendrik Boom
2015-08-19 15:52                             ` Hendrik Boom
2015-08-19 18:09                               ` Anthony Tavener
2015-08-19 15:55                             ` Simon Cruanes
2015-08-19 16:42                               ` Arthur Wendling
2015-08-19 21:15                               ` octachron
2015-08-20  8:06                                 ` Romain Bardou
2015-08-20 17:03                                   ` Yotam Barnoy
2015-08-20 19:19                                     ` Erkki Seppala
2015-08-06  9:23               ` Goswin von Brederlow
2015-08-06  9:21             ` Goswin von Brederlow
2015-08-06 10:19               ` Daniel Bünzli
2015-08-06 13:36                 ` Hendrik Boom
2015-08-14 10:57                   ` Goswin von Brederlow

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAPFanBG+905eK9PuU_bCPBqH5S4zesOsUo7-=xT+Xe8iRQKRVw@mail.gmail.com' \
    --to=gabriel.scherer@gmail.com \
    --cc=caml-list@inria.fr \
    --cc=nils.becker@bioquant.uni-heidelberg.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox