In Elixir, is there any way to get a module to list its functions?

Elixir

Elixir Problem Overview


In the same way that we can get any object (or class) in Ruby to list its methods, is there any function in Elixir to list all functions belonging to a module? Something (at least remotely) like String.functions (where String could be replaced by any other module name)?

Elixir Solutions


Solution 1 - Elixir

Each module in Elixir defines an __info__ function you can call to get information about that module.

According the Elixir Docs, 1.6.6 e.g., you can pass it :functions to get a list of functions that module contains.

Map.__info__(:functions)

[delete: 2, drop: 2, equal?: 2, fetch: 2, fetch!: 2, from_struct: 1, get: 2,
 get: 3, has_key?: 2, keys: 1, merge: 2, merge: 3, new: 0, pop: 2, pop: 3,
 put: 3, put_new: 3, size: 1, split: 2, take: 2, to_list: 1, update: 4,
 update!: 3, values: 1]

Solution 2 - Elixir

Since Elixir is also Erlang, there is an Erlang way to do this as well.

Every Elixir and Erlang module has the function module_info defined at compile time. There are two arities of this function. For example:

iex(1)> Atom.module_info
 [module: Atom,
 exports: [__info__: 1, to_string: 1, to_char_list: 1, module_info: 0,
 module_info: 1], attributes: [vsn:       [66271031909514292894123295368320335064]],
 compile: [options: [:debug_info], version: '6.0.1',
 time: {2015, 9, 29, 2, 34, 37},
 source: '/private/tmp/elixir20150928-10892-fvin6a/elixir-1.1.1/lib/elixir/lib/atom.ex'],
 native: false,
 md5: <<49, 219, 86, 35, 141, 153, 70, 174, 245, 100, 68, 5, 62, 231, 60, 216>>]

You can specify a specific attribute to return.

 iex(2)> Atom.module_info(:exports)
  [__info__: 1, to_string: 1, to_char_list: 1, module_info: 0, module_info: 1]

Erlang function verison:

iex(3)> :crypto.module_info(:exports)
 [version: 0, stop: 0, supports: 0, info_lib: 0, hash: 2, hash_init: 1,
 hash_update: 2, hash_final: 1, hmac: 3, hmac: 4, hmac_init: 2, hmac_update: 2,
 hmac_final: 1, hmac_final_n: 2, block_encrypt: 4, block_encrypt: 3,
 block_decrypt: 3, next_iv: 2, next_iv: 3, stream_init: 3, stream_init: 2,
 stream_encrypt: 2, stream_decrypt: 2, rand_bytes: 1, strong_rand_bytes: 1,
 rand_bytes: 3, rand_uniform: 2, rand_seed: 1, mod_pow: 3, verify: 5, sign: 4,
 public_encrypt: 4, private_decrypt: 4, private_encrypt: 4, public_decrypt: 4,
 exor: 2, generate_key: 2, generate_key: 3, compute_key: 4, md5: 1, md5_init: 0,
 md5_update: 2, md5_final: 1, md4: 1, md4_init: 0, md4_update: 2, md4_final: 1,
 sha: 1, sha_init: 0, sha_update: 2, ...]

This is what the IEx autocomplete function uses that allows you to expand both Elixir and Erlang functions.

Solution 3 - Elixir

I've been using iex(1)> exports TargetModuleName. It lists all functions and macros belonging to a module. I stumbled onto it trying to figure out how to stop Map.__info__(:functions) from truncating a long function list.

Solution 4 - Elixir

Not a function but a way to get module to list its functions in iex is to write the name of the module followed by . then hiting tab:

iex(1)> IO.     ## Hit tab
ANSI                    Stream                  StreamError
binread/1               binread/2               binstream/2
binwrite/1              binwrite/2              chardata_to_string/1
getn/1                  getn/2                  getn/3
gets/1                  gets/2                  inspect/1
inspect/2               inspect/3               iodata_length/1
iodata_to_binary/1      puts/1                  puts/2
read/1                  read/2                  stream/2
warn/1                  warn/2                  write/1
write/2

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioniconoclastView Question on Stackoverflow
Solution 1 - ElixirSteven SchobertView Answer on Stackoverflow
Solution 2 - ElixirFred the Magic Wonder DogView Answer on Stackoverflow
Solution 3 - ElixirsheepgobeepView Answer on Stackoverflow
Solution 4 - ElixirsoftcodeView Answer on Stackoverflow