scala/scala — pull request #3653 by densh (2014-03-24 14:58:48+00:00)
Title: SI-8200 provide an identity liftable for trees

This liftable hasn't been originally included in the set of standard
liftables due to following contradiction:

1. On one hand we can have identity lifting that seems to be quite
consistent with regular unquoting:
```scala
q"..${List(1,2)}" <==> q"1; 2"
q"${List(1,2)}" <==> q"s.c.i.List(1, 2)"
q"..${List(q"a", q"b")}” <==> q"a; b"
q"${List(q"a", q"b")}" <==> q"s.c.i.List(a, b)"
```
This is also consistent with how lisp unquoting works although they
get lifting for free thanks to homoiconicity:
```scala
// scala
scala> val x = List(q"a", q"b"); q"f($x)"
q"f(s.c.i.List(a, b))"
```
```scheme
// scheme
> (let [(x (list a b))] `(f ,x))
'(f (list a b))
```

2. On the other hand lifting is an operation that converts a value into
a code that when evaluated turns into the same value. In this sense
Liftable[Tree] means reification of a tree into a tree that
represents it, i.e.:
```scala
q"${List(q"a", q"b")}"
<==>
q"""s.c.i.List(Ident(TermName("a")), Ident(TermName("b")))"""
```
But I belive that such lifting will be very confusing for everyone
other than a few very advanced users.

This commit introduces the first option as a default Liftable for trees.

review @xeno-by @retronym