DidactMacros

DidactMacros

I’ve been working my way through the Protocols chapter of Programming Elixir, and I came across this exercise in the last section of the chapter:

In many cases, inspect will return a valid Elixir literal for the value being
inspected. Update the inspect function for structs so that it returns valid
Elixir code to construct a new struct equal to the value being inspected.

I went ahead and implemented something:

defimpl Inspect, for: Map do
  def inspect(%{__struct__: module} = struct, opts) do
    tents = Map.delete(struct, :__struct__) |> Enum.to_list
    quote do
      defmodule unquote(module) do
        defstruct unquote contents
      end
    end
    |> Macro.to_string
  end
end

I literally threw this together after writing a small list of steps to be taken based on my understanding of the question, I’ve not assessed the veracity of the inner function here, there is likely a better and faster function than the one I’ve defined but I think the overarching problem is that my scope is too large.

The problem I’m having is that this implementation unfortunately seems to rewrite the entire Inspect.Map implementation module, which messes up a lot other functions and basically makes inspect unusable for my session.

I hoped my implementation would just override the matching function clause, and thus change the way inspect handles structs, but it is instead changing everything about how it handles maps, save for any fallbacks.

I’m also starting to wonder If I’ve understood the exercise itself. Maybe I’m meant to take a more limited approach?

I would really appreciate some guidance.

Showing Posts 1 to 1

DidactMacros

DidactMacros OP

Using

defimpl Inspect, for: Any instead of defimpl Inspect, for: Map

fixes the issue.

Also I edited my OP message to scope the args to Map.delete due to the pipe ( |> )

iex(7) b = %Blob{content: 123}
defmodule Blob do
  defstruct content: 123
end

Even though the question is solved, I do wonder why using defimpl Inspect, for: Any would work, given that an implementation for Map exists and it includes maps that contain:__struct__, keys.

Does my defimpl Inspect, for: Any jump to the top of the list?

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
jonnycharles
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
dli
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app? Looking for hints regarding: Addi...
New
roeland
Kia ora, We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
bottlenecked
Hi all, I wanted to ask how the community is dealing with post-release steps. Today we have Ecto migrations, which make sure that the db...
New
rahultumpala
Hello, I have an Elixir backend that implements a custom protocol over TCP. I want to load test the backend and assess the performance o...
New

Other Trending Topics Top

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
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
ausimian
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

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews