xvw

xvw

Hi, i’m currently writing version 2 of Mizur.

Now, using the Mizur module in another module generates the entire API in the receiver module. This generally avoids dependence on two modules in use.
The Mizur.System module exposes several macros, including the macro type name = ... that creates several functions in the receiver module.

I would like to take advantage of this moment to create a specific guard.
Currently I have this code:

defmodule Mizur.System do
   defmacro __using__(_opts) do 
    quote do 
      import Mizur.System
      # here some uncontextual code ! 
      # This code is included into the macro "type name = ..."
      is = String.to_atom("is_" <> Atom.to_string(name))
      defmacro unquote(is)(e) do
        mod = __MODULE__
        typ = Module.concat(mod, Type)
        n = unquote(name)
        quote do
          case unquote(e) do
            %mod{type: %typ{name: unquote(n)}} -> true
            _ -> false
          end
        end
      end

      # .. the rest of the code, uncontextual to ! 

If I use the code in a simple expression, it will work, but if I write somethings like that :

test "for macros" do 
    import Length
    c = cm(12)

    IO.inspect is_cm(c) # This code is valid.

    case c do 
      x when is_cm(x) -> IO.inspect "lol"
      _ -> IO.inspect "snif"
    end 

I have this output :

** (CompileError) test/mizur_test.exs:112: invalid expression in guard
    expanding macro: MizurTest.Length.is_cm/1
    test/mizur_test.exs:112: MizurTest."test for macros"/1
    (elixir) lib/code.ex:370: Code.require_file/2
    (elixir) lib/kernel/parallel_require.ex:57: anonymous fn/2 in Kernel.ParallelRequire.spawn_requires/5

I do not know if I made any mistake.

Regards, Xavier !

Showing Posts 1 to 5

NobbZ

NobbZ

Afair you can neither access maps in guards nor you can use a case

xvw

xvw OP

Ok, thanks !

OvermindDL1

OvermindDL1

Yeah if you are making an is_* guard then you can only use other guards inside it. Take a look at my defguard library to see how I generate guards.

(EDIT: Do note, the entire code of that library is a huge hack that overwrites def and defp and so forth and should not be used as an example of what to do except for the guard part itself, that library is purely an example to see ‘if I could do something’, not ‘should’ ^.^)

i_a

i_a

Is it still true that you can’t access maps in guards? I have this and it works okay:

defmodule XXXX.Guards do
  # Check if a value has the production live mode.
  defguard is_production(value)
           when is_map(value) and
                  is_boolean(value.live_mode) and
                  value.live_mode == true

  # Check if a value has the sandbox live mode.
  defguard is_sandbox(value)
           when is_map(value) and
                  is_boolean(value.live_mode) and
                  value.live_mode == false
end
defmodule XXXXX.GuardsTest do
  use ExUnit.Case, async: true

  require XXXXX.Guards
  alias XXXXX.Guards

  describe "is_production/1" do
    test "identifies a production value" do
      assert Guards.is_production(%{live_mode: true})
    end

    test "identifies a sandbox value" do
      refute Guards.is_production(%{live_mode: false})
    end
  end

  describe "is_sandbox/1" do
    test "identifies a production value" do
      refute Guards.is_sandbox(%{live_mode: true})
    end

    test "identifies a sandbox value" do
      assert Guards.is_sandbox(%{live_mode: false})
    end
  end
end
LostKobrakai

LostKobrakai

It‘s no longer the case. 1.10 added support for the map guards OTP added in version 21.

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
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
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews