Smerl breakthough: metacurrying

Yariv Sadan <>
Tue Aug 22 21:01:27 CEST 2006

> This functionality is similar to Lisp's quasiquoting. It is generalized
> by quasipatterns in E:
> <>
> (That page unfortunately assumes a lot of context that might be opaque
> to people not familiar with E, but hopefully the main ideas will come
> through.)
> Quasipatterns are more general because, as well as being able to make
> substitutions (what you call metacurrying), they also allow pattern
> matching on programs without having to know the abstract form.


I added to Smerl a function called embed_params/2. It's more general
than metacurrying because it can substitute any parameter with a
variable in the body of a function, but it also requires more work
from the user because the names of the parameters must be provided as
well as their values.


M1 = smerl:new(foo),
{ok, M2} = smerl:add_func(M1, "bar(A,B,C) -> A+B*2+C*3."),
{ok, F1} = smerl:get_func(M1, bar, 3),
F2 = smerl:embed_params(F1, [{'A', 3}, {'C', 5}]),
{ok, M3} = smerl:add_func(M2, F2),
foo:bar(2) = 22.

This may not be as powerful as quasiquoting, but I have found it
useful in my current project.

(I could also add some helper functions to reduce the LOC in this example.)


More information about the erlang-questions mailing list