On Fri, Jul 3, 2015 at 11:04 PM, Yichao Yu <yyc1...@gmail.com> wrote:
> On Fri, Jul 3, 2015 at 8:37 PM, Kevin Owens <kevin.j.ow...@gmail.com> wrote:
>> Yes, you're right, that won't work.
>>
>> I got to thinking about this from this part of the DataFrames documentation:
>> http://dataframesjl.readthedocs.org/en/latest/getting_started.html#the-dataframe-type
>>
>> df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"])
>>
>> and this code
>>
>> df = DataFrame()
>> df[:A] = 1:8
>> df[:B] = ["M", "F", "F", "M", "F", "M", "M", "F"]
>> df
>>
>> If I already had arrays A and B (or an arbitrary number of them) it would be
>> nice to be able to do
>>
>> df = DataFrame(A, B)
>>
>> and then df would have column names :A and :B.
>>
>
> And that's exactly what I guessed what you wanted (because I've done
> sth similar in python sometime ago :P)
>
> The right way to do this is to specify the name of the variable
> because a variable is always bound to a single object while a object
> can be bound to multiple varialbles.
>
> The way I did it in python was using eval. However, in Julia, the eval
> function is working in the global (module) scope (otherwise the
> compiler cannot reason anything about local variables) so you cannot
> use it to get the value of a variable. One way to do this in julia is
> using macros
>
> What you want is basically to write sth like:
>
> ```
> <some magic>(A, B)
> ```
>
> to achieve the effect of
>
> ```
> DataFrame(A=A, B=B)
> ```
>
> Well, this is a simple code transformation. (untested code below)

Not untested anymore....

```
julia> macro dataframe(args...)
      :(DataFrame($([Expr(:kw, arg, arg) for arg in args]...)))
      end

julia> macroexpand(:(@dataframe(A, B)))
:(DataFrame(A=A,B=B))

julia> Meta.show_sexpr(macroexpand(:(@dataframe(A, B))))
(:call, :DataFrame, (:kw, :A, :A), (:kw, :B, :B))
julia> Meta.show_sexpr(:(DataFrame(A=A, B=B)))
(:call, :DataFrame, (:kw, :A, :A), (:kw, :B, :B))
```

>
> ```
> macro dataframe(args...)
> :(DataFrame($([Expr(:kw, arg, arg) for arg in args]...)))
> end
> ```
>
> If you would like to figure out how to write a macro, the general
> procedure is to see the input and output AST with `Meta.show_sexpr`
> (which is better than `show` for this because some symbols are parsed
> differently in different context) and then write a program to do the
> transformation.
>
>>
>>
>> On Friday, July 3, 2015 at 7:24:55 PM UTC-5, Yichao Yu wrote:
>>>
>>> On Fri, Jul 3, 2015 at 8:21 PM, Kevin Owens <kevin....@gmail.com> wrote:
>>> > Gah, nevermind:
>>> >
>>> > function as_symbol(x)
>>> >     :(print(x)).args[2]
>>> > end
>>>
>>> This is almost certainly not what you want unless you just want a
>>> function that returns `:x`, in which case, you would be better off to
>>> just return that.
>>>
>>> Can you elaborate on what exactly you would like to do? Depending on
>>> what you really want, there are different ways to implement.
>>>
>>> >
>>> >
>>> > (using print() so that it works regardless of the type)
>>> >
>>> >
>>> > On Friday, July 3, 2015 at 7:16:38 PM UTC-5, Kevin Owens wrote:
>>> >>
>>> >> Say you have an array
>>> >>
>>> >> x = rand(5)
>>> >>
>>> >> or just any variable
>>> >>
>>> >> y = "abc"
>>> >>
>>> >> How would I write a function that I would call like foo(x) and would
>>> >> return the symbol :x?

Reply via email to