Quoting operator & literals

Anything can be an expression (or part of an expression) in Julia. Eg

julia> immutable Foo x end
julia> dump(:(x + $(Foo(9))))
Expr
  head: Symbol call
  args: Array{Any}((3,))
    1: Symbol +
    2: Symbol x
    3: Foo
      x: Int64 9
  typ: Any

so Foo(9) is just sitting there as an argument until + is called, and it is not an Expr, which :(Foo(9)) would be. (See this comment on a question I asked recently for related concepts).

More related to your application: I imagine a symbol eg :x is also symbolically differentiable, and it is not an expression. So don’t restrict the types.

Finally, you may find this library useful: