[erlang-questions] The display/1Gotcha

Olivier BOUDEVILLE olivier.boudeville@REDACTED
Wed Jan 26 11:14:51 CET 2011


Hi Kenneth, Hi Lukas,

Thanks for your answers.  At first I was not able to reproduce the issue 
on a minimal example, but, as you both hinted, original code was correct 
and should not have led to a local function being shadowed by a 
"built-in": apparently the culprit is the smart_exception parse transform.

At least this is what is suggested by:

"""
-module(minimal_test).

-export([ run/0, display/1 ]).

run() ->
     display( "Smart exceptions do not seem to work properly." ).

display( T ) ->
     io:format( "My function was called, really?!?~n" ),
     throw( {called_with,T} ).
"""

Then a vanilla compilation works as expected, whereas the one with 
smart_exception behaves wrongly:

"""
> erl
Erlang R14B01 (erts-5.8.2) [source] [64-bit] [smp:8:8] [rq:8] 
[async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.2  (abort with ^G)
1> c(minimal_test).
{ok,minimal_test}
2> minimal_test:run().
My function was called, really?!?
** exception throw: {called_with,"Smart exceptions do not seem to work 
properly."}
     in function  minimal_test:display/1
3> c(minimal_test,[{parse_transform, smart_exceptions}]).
{ok,minimal_test}
4> minimal_test:run().
"Smart exceptions do not seem to work properly."
true
"""

It looks like that, unless in my code I use ?MODULE:display/1, 
erlang:display/1 will be called instead if smart exceptions are used.

(by the way, I am using the devel version of smart_exception that I 
downloaded a month ago, since there were an issue with the stable version 
as well, as described in 
http://erlang.2086793.n4.nabble.com/Problems-With-Smart-Exceptions-td3095862.html)

So, unless I am mistaken, I suppose smart exceptions should better be 
disabled? 
This is a bit of a pity as it is a quite nice feature, useful to avoid 
additional intellectual puzzles.

Best regards,

Olivier Boudeville.
---------------------------
Olivier Boudeville

EDF R&D : 1, avenue du Général de Gaulle, 92140 Clamart, France
Département SINETICS, groupe ASICS (I2A), bureau B-226
Office : +33 1 47 65 59 58 / Mobile : +33 6 16 83 37 22 / Fax : +33 1 47 
65 27 13



kenneth.lundin@REDACTED 
25/01/2011 17:09

A
olivier.boudeville@REDACTED
cc

Objet
Re: [erlang-questions] The display/1Gotcha






Hi,

I don't understand what you mean please provide a complete example.

If we for example have this module

-module(dtest).

-export([f/0]).

f() -> display("String").

display(String) ->
  {local_display_called_with,String}.

Then in both R13B04 and in R14A (when we introduced a change in semantics
so that autoimported BIFs no longer override local functions) the local 
function
named display will be called when you call dtest:f().

Also note that erlang:display/1 is not an autoimported BIF. You must 
always
call it giving the modulename erlang.

/Kenneth Erlang/OTP Ericsson

On Tue, Jan 25, 2011 at 4:32 PM, Olivier BOUDEVILLE
<olivier.boudeville@REDACTED> wrote:
> Hi,
>
> Wouldn't it be nice if erlang:display/1 did not silently shadow any
> user-defined display/1? I have been bitten more than once by this.
>
> Currently, defining in a module display/1 and calling it from another
> function directly, without mentioning a module (ex: 'f(Term) ->
> display(Term).') will call erlang:display/1instead of calling the
> lesser-astonishing ?MODULE:display/1.
>
> As erlang:display/1is not so very well-known and display is a rather
> common verb, maybe this would deserve forcing its call with an explicit
> module prefix (i.e. 'erlang:display(Term)'; if it is possible not to
> auto-import it) or at least issue a warning like "warning: local 
function
> display/1 will be shadowed by erlang:display/1"?
>
> Best regards,
>
> Olivier Boudeville.
> ---------------------------
> Olivier Boudeville
>
> EDF R&D : 1, avenue du Général de Gaulle, 92140 Clamart, France
> Département SINETICS, groupe ASICS (I2A), bureau B-226
> Office : +33 1 47 65 59 58 / Mobile : +33 6 16 83 37 22 / Fax : +33 1 47
> 65 27 13
>
>
>
> Ce message et toutes les pièces jointes (ci-après le 'Message') sont 
établis à l'intention exclusive des destinataires et les informations qui 
y figurent sont strictement confidentielles. Toute utilisation de ce 
Message non conforme à sa destination, toute diffusion ou toute 
publication totale ou partielle, est interdite sauf autorisation expresse.
>
> Si vous n'êtes pas le destinataire de ce Message, il vous est interdit 
de le copier, de le faire suivre, de le divulguer ou d'en utiliser tout ou 
partie. Si vous avez reçu ce Message par erreur, merci de le supprimer de 
votre système, ainsi que toutes ses copies, et de n'en garder aucune trace 
sur quelque support que ce soit. Nous vous remercions également d'en 
avertir immédiatement l'expéditeur par retour du message.
>
> Il est impossible de garantir que les communications par messagerie 
électronique arrivent en temps utile, sont sécurisées ou dénuées de toute 
erreur ou virus.
> ____________________________________________________
>
> This message and any attachments (the 'Message') are intended solely for 
the addressees. The information contained in this Message is confidential. 
Any use of information contained in this Message not in accord with its 
purpose, any dissemination or disclosure, either whole or partial, is 
prohibited except formal approval.
>
> If you are not the addressee, you may not copy, forward, disclose or use 
any part of it. If you have received this message in error, please delete 
it and all copies from your system and notify the sender immediately by 
return message.
>
> E-mail communication cannot be guaranteed to be timely secure, error or 
virus-free.
>




Ce message et toutes les pièces jointes (ci-après le 'Message') sont établis à l'intention exclusive des destinataires et les informations qui y figurent sont strictement confidentielles. Toute utilisation de ce Message non conforme à sa destination, toute diffusion ou toute publication totale ou partielle, est interdite sauf autorisation expresse.

Si vous n'êtes pas le destinataire de ce Message, il vous est interdit de le copier, de le faire suivre, de le divulguer ou d'en utiliser tout ou partie. Si vous avez reçu ce Message par erreur, merci de le supprimer de votre système, ainsi que toutes ses copies, et de n'en garder aucune trace sur quelque support que ce soit. Nous vous remercions également d'en avertir immédiatement l'expéditeur par retour du message.

Il est impossible de garantir que les communications par messagerie électronique arrivent en temps utile, sont sécurisées ou dénuées de toute erreur ou virus.
____________________________________________________

This message and any attachments (the 'Message') are intended solely for the addressees. The information contained in this Message is confidential. Any use of information contained in this Message not in accord with its purpose, any dissemination or disclosure, either whole or partial, is prohibited except formal approval.

If you are not the addressee, you may not copy, forward, disclose or use any part of it. If you have received this message in error, please delete it and all copies from your system and notify the sender immediately by return message.

E-mail communication cannot be guaranteed to be timely secure, error or virus-free.


More information about the erlang-questions mailing list