Function Applications 

There are two ways to write function applications. The first way is calling APPLY(arg, ...) on a symbol or a tree. Here, arg denotes a Tree:

scala> import treehugger.forest._, definitions._, treehuggerDSL._
import treehugger.forest._
import definitions._
import treehuggerDSL._

scala> val tree = Predef_println APPLY LIT("Hello, world!")
[1m[34mtree[0m: [1m[32mtreehugger.forest.Apply[0m = Apply(Ident(println),List(Literal(Constant(Hello, world!))))

scala> treeToString(tree)
[1m[34mres0[0m: [1m[32mString[0m = println("Hello, world!")

scala> val tree2 = (REF("x") DOT "y") APPLY (LIT(0), LIT(1))
[1m[34mtree2[0m: [1m[32mtreehugger.forest.Apply[0m = Apply(Select(Ident(x),y),List(Literal(Constant(0)), Literal(Constant(1))))

scala> treeToString(tree2)
[1m[34mres1[0m: [1m[32mString[0m = x.y(0, 1)

Function application on selections 

The second way is to apply arg, ... on intermediate structure returned by DOT(sym|"y"):

scala> val tree3 = (REF("x") DOT "y")(LIT(0), LIT(1))
[1m[34mtree3[0m: [1m[32mtreehugger.forest.Apply[0m = Apply(Select(Ident(x),y),List(Literal(Constant(0)), Literal(Constant(1))))

scala> treeToString(tree3)
[1m[34mres2[0m: [1m[32mString[0m = x.y(0, 1)

Sequence arguments 

To pass sequence into a vararg parameter, use SEQARG(arg):

scala> val tree4 = THIS APPLY (SEQARG(REF("list")))
[1m[34mtree4[0m: [1m[32mtreehugger.forest.Apply[0m = Apply(This(),List(Typed(Ident(list),Ident(_*))))

scala> treeToString(tree4)
[1m[34mres3[0m: [1m[32mString[0m = this((list: _*))

Named arguments 

To pass named arguments into a function, specify the parameter using REF(sym|"x") as follows:

scala> val tree5 = REF("put") APPLY (REF("x") := LIT(0))
[1m[34mtree5[0m: [1m[32mtreehugger.forest.Apply[0m = Apply(Ident(put),List(Assign(Ident(x),Literal(Constant(0)))))

scala> treeToString(tree5)
[1m[34mres4[0m: [1m[32mString[0m = put(x = 0)

Partially applied functions 

Partially applied functions are written by calling APPLY with PARTIALLY:

scala> val tree6 = REF("put") APPLY PARTIALLY
[1m[34mtree6[0m: [1m[32mtreehugger.forest.Apply[0m = Apply(Ident(put),List(Ident(<partially>)))

scala> treeToString(tree6)
[1m[34mres5[0m: [1m[32mString[0m = put _

Note this is different from APPLYing WILDCARD since PARTIALLY applies to the entire parameter list.