[erlang-questions] lists:reverse/1 as a built-in function

Robert Baruch autophile@REDACTED
Tue Jan 16 17:50:45 CET 2007


On Jan 16, 2007, at 5:25 AM, Thomas Lindgren wrote:

>
> First of all, I'd recommend you have a look at
> Erlang's packages, which are fairly Java-inspired, as
> far as I know.

Yeah, I've seen that already. It's okay, but I don't think it goes  
far enough. Again, it seems to me that modules are useful for  
grouping related functionality (such as functions about lists, or  
functions about strings), and so I considered a module as  
conceptually equivalent to a Java class with all static methods, and  
an Erlang package name is a way of grouping modules, just as a Java  
package name is a way of grouping Java classes.

In Java, if you import, say, java.io.InputStream, then you would  
still have to refer to static InputStream methods using  
InputStream.method() and not just method().

Similarly, if you import java.io.*, that allows you to refer to any  
class X in java.io as X instead of as java.io.X.

Based on that idea, -import(foo.bar.baz) where baz is a module name  
would allow you to use baz:function(), but should not allow you to  
use function(). This is the equivalent to Java's import  
java.io.InputStream.

Also, you get the added advantage that -import(foo.bar) will allow  
you to access any module X in package foo.bar using X:method()  
instead of foo.bar.X:method(). This is the equivalent to Java's  
import java.io.*.

>
>> If you call example_function(Arg) anywhere else, you
>> need to either
>> call it as foo.bar.baz:example_function(Arg), or you
>> need to -import
>> (foo.bar), and then you must call it as
>> baz:example_function(Arg).
>
> What if example_function/1 is imported into module m
> and also is defined in m? If I (locally, in m) call
> example_function(1), which function would this
> proposal invoke?

If example_function/1 is imported into module m, then it must be  
imported from some module X. Then you must call X's example_function/ 
1 as X:example_function/1, and m's function would just be called as  
example_function/1. The names would not clash because they exist in  
different namespaces.

>
> For example:
>
> -module(m).
> -compile(export_all).
> %% f/1 is auto-imported
>
> f(1) -> ok.
>
> g(X) -> f(X). %% which f/1 is called?

You could handle this in one of two ways:

(1) This would be a compile-time error. At the time that you declare f 
(1), f/1 has already been declared because it was auto-imported. This  
is pretty strict, but requires the least number of compilation passes.

(2) The auto-imported f/1 is not available in this module without  
full qualification. Thus, f(X) will always call m:f/1, and to use the  
"auto-imported" f/1, you have to fully qualify it (as, for example,  
erlang:f/1). This would require two-pass compilation, since first you  
have to determine the local names that are declared, then you have to  
resolve the calls based on the declared local names.

Java doesn't really have an equivalent to this issue, because there  
is no global namespace for methods to pollute.  All methods exist in  
their class's namespace, and the only auto-import done is  
java.lang.*, which still means you have to use X.method when calling  
a method in java.lang.X.

>
>> The reason that I call baz the "class" name /.../
>
> Not to sound too bad-tempered, but please don't do
> that :-) The Java terminology doesn't quite
> transplant, so it's liable to just be confusing.

Yeah, you're right :) I'll try to stick to "package and module" when  
talking about Erlang :)

But just in case people are getting confused, here's my dictionary :)

Java class -> Erlang module
Java package -> Erlang package
Java method -> Erlang function

--Rob



More information about the erlang-questions mailing list