Skip to content

Attempt at code recognition and transformation tools

License

Notifications You must be signed in to change notification settings

Shakadak/circe.ex

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Circe

Enchantress expert at transformation.

This library aims at providing convenient tool for manipulating Elixir's AST. Currently there is only a sigil macro that help defining patterns in more declarative way.

A few quick examples:

iex(1)> import Circe
Circe
iex(2)> ~m/{:banana}/ = quote do {:banana} end
{:{}, [], [:banana]}
iex(3)> ~m/{#{x}}/ = quote do {:banana} end
{:{}, [], [:banana]}
iex(4)> ~m/{#{x}}/ = quote do {:banana, :split, :dessert} end
** (MatchError) no match of right hand side value: {:{}, [], [:banana, :split, :dessert]}

iex(4)> ~m/{#{...xs}}/ = quote do {:banana} end
{:{}, [], [:banana]}
iex(5)> xs
[:banana]
iex(6)> ~m/{#{x}}/ = quote do {:banana, :split} end
** (MatchError) no match of right hand side value: {:banana, :split}

iex(6)> ~m/{#{...x}}/ = quote do {:banana, :split} end
** (MatchError) no match of right hand side value: {:banana, :split}

As can be seen from the last two examples, it's not yet possible to match on asts that can be literals when it's representation could also be an application. In the case here:

  • 2-tuples are represented literally: {:banana, :split} = quote do {:banana, :split} end
  • n-tuples (where n ≠ 2) are represented as an application {:{}, _, xs} when is_list(xs) = quote do {:a, :b, :c, :d} end

No idea how to do that natively, we would need a way to merge multiple patterns into one. It should be possible with pattern synonyms though. (You can take a look at the package pattern_metonyms.)

About

Attempt at code recognition and transformation tools

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages