Onor.io
Three Ways To Share Values Between Modules
A new REPL on Replit to help demonstrate three techniques to safely share values between modules. DRY up your code in a safe way!
defmodule MyMath do
@moduledoc """
This repl documents three ways to share values between modules.
The question may occur to the reader--why would I want to share values between modules? It's a valid question. It is often the case that we need to share some common piece of logic among different contexts. For example if we use a regular expression (regex) to parse, for example, an address, we want to insure we use the same regex every place we need to parse an address. We can certainly copy/paste the regex but that leads to a lot more work for later developers who if they find they need to modify the regex must insure they find all the uses of the regex and modify all of them. This becomes an even larger issue when you have teams of developers, potentially distributed across geography. Communication is already a problem in that case and it's far more likely that someone will miss something.
The following repl is structured as one file with two modules to make it easy to run and observe the behavior. The Main module gives examples of how to use the shared values across modules.
You can try the following in the console to assure yourself that this all works as expected:
## Examples
iex> radius = 3.0
3.0
iex> Main.circle_area(radius) == Main.circle_area_alternate(radius)
true
iex> Main.circle_area_macro_approach(radius) == Main.circle_area(radius)
true
"""
#First symbolic constant technique: module attribute
Module.register_attribute(__MODULE__, :pi, persist: true)
@pi 3.141592653
#Second symbolic constant technique: function to return constant value
def pi, do: 3.141592653
# this could also be:
# def pi, do: @pi
#Third symbolic constant technique (many thanks to Paul Schoenfelder for this): macro
defmacro __using__(_) do
quote do
@pi 3.141592653
end
end
end
defmodule Main do
defp get_pi do # module attribute approach
[pi] = MyMath.__info__(:attributes)[:pi]
pi
end
def circle_area(radius) when is_float(radius) do
MyMath.pi() * radius * radius #constant function approach
end
# or
def circle_area_alternate(radius) when is_float(radius) do
get_pi() * radius * radius
end
# or
use MyMath
def circle_area_macro_approach(radius) when is_float(radius) do
@pi * radius * radius
end
end
Most Liked
Onor.io
Thanks for moving this to the right place. I tried posting under Learning Resources but I couldn’t.
Yeah I figured people would just click the Run button and then try the examples but I can see how that may be not as obvious as I would have hoped.
1
Last Post!
AstonJ
Popular in Guides/Tuts
Greetings: I just wrote a step-by-step guide on building a Phoenix 1.3 JWT Auth API with Guardian JWTs and Comeonin password hashing.
I ...
New
Greetings fellow alchemists !
I have started to write an open-source interpreter in Elixir (GitHub - nicolasdilley/dwarf-interpreter: Th...
New
If you want to use the MongoDB in your next Killer-App-Project, but you did not dare ask because otherwise many would advise you to use P...
New
I was preparing to deploy a production application to AWS Fargate, and to practice I wanted to play with DNS polling and node discovery o...
New
When we were figuring out how to use Phoenix LiveView we got stuck a few times.
So in order to save other people time, we created a comp...
New
I couldn’t find any guides that worked well with Phoenix 1.6.0 and esbuild. I hope this helps people test the waters and eases you into t...
New
Hey guys I’ve made a guide on how to connect Quill to Phoenix.
For the sake of formatting it might be easier to view it on my Notion Doc...
New
Other popular topics
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
What is the proper way to load a module from a file in to IEX?
In the python world, doing something like this pretty standard:
from ....
New
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
What is the idiomatic way of matching for not nil in Elixir?
E.g.,
First way:
defp halt_if_not_signed_in(conn, signed_in_account) when...
New
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
New
Hello all!
I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









