Shun_di
Hi,
I’m just starting out with Elixir, however I have used Erlang for about half a year so its not to hard to make the jump across.
However, I am having real trouble with using Erlang records in Elixir.
I have an existing hrl file in a dependency that has two records. I want to be able to extract them and then populate them for use elsewhere.
I am using the following syntax to try and extract them:
Record.defrecord :record_name, Record.extract(:record_name, from: "deps/mydependency/include/header_file.hrl")
However, when I try to compile this I get the following:
== Compilation error in file lib/otherdb.ex ==
** (ArgumentError) cannot invoke defmacro/2 inside function/macro
(elixir) lib/kernel.ex:5187: Kernel.assert_no_function_scope/3
(elixir) lib/kernel.ex:3952: Kernel.define/4
(elixir) expanding macro: Kernel.defmacro/2
lib/otherdb.ex:28: OHTERDB.defname/0
(elixir) expanding macro: Record.defrecord/2
lib/otherdb.ex:28: OHTERDB.defname/0
I’ve seen many other examples of people using this syntax, so I must be doing something wrong.
Any help on this would be appreciated.
Trending in Questions
Hello!
Suppose you are building workflow (order / task / payment) processing system with the following requirements:
Each workflow con...
New
I’m aware of 2 such projects, are there others?
git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
Hi everyone.
My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
Hello folks!
So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
How Can I Optimise Compile Time Dependencies
I have been building an elixir application for about 2 years now. Many modules and files ha...
New
Other Trending Topics
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with.
But I don’t use it anymore.
Serverless was the promis...
New
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #security
- #hex










Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
easco
It looks like you are trying to make your
defrecordcall from inside of a function like:The error says the
defrecordcall must be moved out of the function, presumably to the level of the module.rvirding
IIRC
defrecorddefines a record, it does not create an instance. Pretty much the same as-record(Name, {...}).in Erlang.NobbZ
You are right, and
Record.extract/2extracts a keywordlist from a*.hrl, which can be used inRecord.defrecord.But it seems as if he were trying to extract a record from a dependency, so it should be
:from_libinstead of:from.Additionally what @easco said seems to be valid as well:
Proof:
As you can see, the errormessage has the same shape.
Shun_di
Thanks for responses guys.
Yep, I’m a bit of an idiot.
easco is right, I had put this in a function whereas it should have been at module level. I corrected this and it was fine.
The next thing I am trying to do is populate the record that has been defined.
In Erlang I can do this by doing the following (I need them to go into a list hence the square brackets):
things = [#thing{name = “bob”, age = 30, job = “Elixir Dev”}]
I thought I could do it something like this based on research but I’m probably/most likely wrong (this is without it being a list):
thing2 = thing.new(
name = “bob”,
age = 30,
job = “Elixir Dev”)
NobbZ
You need to import the module that contains the defrecord.
Then you can use the generated macro which has the same name as your record. You can find examples in the documentation of Record.defrecord
rvirding
IIRC (again) make the argument to
newa keyword list. It would become something like:Don’t forget that Erlang strings and Elixir strings are not the same.
Shun_di
Thanks again for your help guys. I think I’m starting to get the hang of Elixir now.
I put the extract line into it own module, and imported it and used the syntax in rvirding’s post above and all is working well.
I’m now creating a bigger project but I am still using the same erlang records in it.
However, the extract line will be in a separate app (app1) and I will be calling from a separate app (app2). So app1 will be a dependency in app2. However, when I try and compile I get the following error:
== Compilation error in file lib/app1/mymodule.ex ==
** (RuntimeError) error parsing file deps/mydependency/include/erlangheaderfile.hrl, got: {:error, :enonet}
(elixir) lib/record/extractor.ex:84: Record.Extractor.read_file/2
Its probably something simple that I am missing as it works if I have this in the same app/project. Any ideas what I am doing wrong?
NobbZ
Can you please show the line how you are extracting the record?
And how are you specifiying the dependency in your mixfile?
Shun_di
Sure no problem.
I’m using the same syntax as before with the exception of from_lib now:
Record.defrecord :record_name, Record.extract(:record_name, from_lib: “mydependency/include/header_file.hrl”)
I’m using the standard dependency git syntax in “app1”. Something like this:
{:mydependency, git "git@someurl.git, tag: “atag”, override: true}
in “app2” i’m using the same syntax but to call “app1” as a dependency:
{:app1, git "git@someurlforapp1.git, tag: “atag”, override: true}
I don’t have the :mydependency dependency in “app2”. Should I have?
I hope that helps.
NobbZ
So you are trying to read into a transient dependency this way? I’m not sure if this is possible. Try to add
:mydependencyin:app2as well and check if it works.If not, please try to provide some minimal project(s) at github or otherwise publicly which reproduce the problem such that we can take a deeper look at it.