dokuzbir
Need help about quote and unquote
This code is from metaprograming elixir book. I dont understand when should use unquote. In first function there is no unqote to execute expression but in second function there is unquote why ?
defmodule ControlFlow do
# Why there is no unquote here ?
defmacro my_if(expr, do: if_block), do: if(expr, do: if_block, else: nil)
# Why there is unquote here ?
defmacro my_if(expr, do: if_block, else: else_block) do
quote do
case unquote(expr) do
result when result in [false, nil] -> unquote(else_block)
_ -> unquote(if_block)
end
end
end
end
Trending in Questions
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
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
Using Phoenix.LiveView.TagEngine as an EEx.Engine is deprecated!
To compile HEEx, use Phoenix.LiveView.TagEngine.compile/2 instead.
Sta...
New
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app?
Looking for hints regarding:
Addi...
New
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
I am using Oban and occasionally, shortly after a deployment, a handful of jobs can fail because of dependency on other parts of the syst...
New
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
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
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
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
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
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New
@hugobarauna and I (Alex Koutmos) have been hard at work on writing a book on Nerves that takes you from simply blinking LEDs to building...
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
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #hex
- #performance










First 8 of 8 Posts
gregvaughn
I suspect there’s a typo there. The first
my_ifclause should be:so it delegates to the 2nd clause
dokuzbir
But it works when it is if.
gregvaughn
It’s calling
Kernel.if/2which is a macro that handles the quoting itself. But if you’re going to rely onKernel.ifthen why writemy_if? That’s why I think it’s a typo.dokuzbir
So in a macro we can use another macro without quote. Thanks i got it
dokuzbir
I tried a smilar approach for while as first if function, but my_second_while function freezes iex.
my_whilefunction is working as expectediex
OvermindDL1
Should be:
Also, your
Stream.cyclebit is not ever going to end, it will loop forever?dokuzbir
Yes i guess so but why first my_if function works without unquote? what is difference? That example from book yes never ends
aethereus
Your no-quote version of
my_ifdoes not work. I tested it with the following code:And I saw that the sentence “This should not be printed.” is actually printed. This is because when you pass
1 > 2toexpr, it gets automatically quoted (becomes AST), and the AST is{:>, [context: Elixir, import: Kernel], [1, 2]}and is notfalseornil, so the test ofif(expr, ...)passes, and theif_block(which is also an AST) gets returned by the macromy_if.If you test it with
You get the correct behavior by accident because
falseis an atom, and atoms are “Elixir literals” that have exactly the same form in code and in AST.