I needed to ad a `convert(Vector{Symbol}, .....)`, since map can't tell
it's a Symbol array, why?
function builtins()
nams = filter(s -> isdefined(Base, s), names(Base, true, true))
objs = map(s -> Base.(s), nams)
funcs = filter(x -> isa(x, Function) && isa(x.env, Symbol), objs)
convert(Vector{Symbol}, sort!(map(symbol, unique(funcs))))
end
julia> builtins()
22-element Array{Symbol,1}:
:_apply
:_expr
:applicable
:apply_type
:arrayref
:arrayset
:arraysize
:fieldtype
:getfield
:invoke
⋮
:isdefined
:issubtype
:kwcall
:nfields
:setfield!
:svec
:throw
:tuple
:typeassert
:typeof
El domingo, 27 de diciembre de 2015, 15:03:04 (UTC-6), Ismael Venegas
Castelló escribió:
>
> We could use something like this:
>
> julia> isbuiltin(x) = in(symbol(x), builtins())
> isbuiltin (generic function with 1 method)
>
> julia> isbuiltin(is)
> true
>
> We could also change this functions documentation, something like this:
>
> help?> is
> search: ind2sub ind2sub! @ip_str include_string @int128_str is isa issym
> isqrt
>
> Builtin function:
>
> is(x, y) -> Bool
> ===(x,y) -> Bool
> ≡(x,y) -> Bool
>
> Determine whether x and y are identical, in the sense that no program
> could
> distinguish them. Compares mutable objects by address in memory, and
> compares immutable objects (such as numbers) by contents at the bit
> level.
> This function is sometimes called egal.
>
> .. ===(x, y)
> ≡(x,y)
>
> See the :func:`is` operator
>
>
>
> El domingo, 27 de diciembre de 2015, 14:59:31 (UTC-6), Ismael Venegas
> Castelló escribió:
>>
>> So `is` is a builtin anonymous function?
>>
>> julia> Base.function_name(is)
>> :anonymous
>>
>> Stefan perhaps we should add a builtins function to inference.jl? Indeed
>> it's not obvious at all!
>>
>> julia> function builtins()
>> nams = filter(s -> isdefined(Base, s), names(Base, true, true))
>> objs = map(s -> Base.(s), nams)
>> funcs = filter(x -> isa(x, Function) && isa(x.env, Symbol),
>> objs)
>> sort!(map(symbol, unique(funcs)))
>> end
>> builtins (generic function with 1 method)
>>
>> julia> builtins()
>> 24-element Array{Any,1}:
>> :_apply
>> :_expr
>> :applicable
>> :apply_type
>> :arraylen
>> :arrayref
>> :arrayset
>> :arraysize
>> :fieldtype
>> :getfield
>> :invoke
>> :is
>> :isa
>> :isdefined
>> :issubtype
>> :kwcall
>> :method_exists
>> :nfields
>> :setfield!
>> :svec
>> :throw
>> :tuple
>> :typeassert
>> :typeof
>>
>> julia>
>>
>>
>>
>> El domingo, 27 de diciembre de 2015, 14:36:52 (UTC-6), Stefan Karpinski
>> escribió:
>>>
>>> In Julia 0.4 anonymous functions are non-generic (in 0.5 they will,
>>> however, be generic), so that's one way to create a non-generic function.
>>> Aside from anonymous functions, the only non-generic are the builtins,
>>> defined in C code using the add_builtin_func function:
>>>
>>> $ ack add_builtin_func src
>>> src/builtins.c
>>> 1196:static void add_builtin_func(const char *name, jl_fptr_t f)
>>> 1204: add_builtin_func("is", jl_f_is);
>>> 1205: add_builtin_func("typeof", jl_f_typeof);
>>> 1206: add_builtin_func("sizeof", jl_f_sizeof);
>>> 1207: add_builtin_func("issubtype", jl_f_subtype);
>>> 1208: add_builtin_func("isa", jl_f_isa);
>>> 1209: add_builtin_func("typeassert", jl_f_typeassert);
>>> 1210: add_builtin_func("throw", jl_f_throw);
>>> 1211: add_builtin_func("tuple", jl_f_tuple);
>>> 1214: add_builtin_func("getfield", jl_f_get_field);
>>> 1215: add_builtin_func("setfield!", jl_f_set_field);
>>> 1216: add_builtin_func("fieldtype", jl_f_field_type);
>>> 1217: add_builtin_func("nfields", jl_f_nfields);
>>> 1218: add_builtin_func("isdefined", jl_f_isdefined);
>>> 1221: add_builtin_func("arrayref", jl_f_arrayref);
>>> 1222: add_builtin_func("arrayset", jl_f_arrayset);
>>> 1223: add_builtin_func("arraysize", jl_f_arraysize);
>>> 1226: add_builtin_func("applicable", jl_f_applicable);
>>> 1227: add_builtin_func("invoke", jl_f_invoke);
>>> 1230: add_builtin_func("apply_type", jl_f_instantiate_type);
>>> 1231: add_builtin_func("_apply", jl_f_apply);
>>> 1232: add_builtin_func("kwcall", jl_f_kwcall);
>>> 1233: add_builtin_func("_expr", jl_f_new_expr);
>>> 1234: add_builtin_func("svec", jl_f_svec);
>>>
>>>
>>> You can determine the same list from the Julia side by this
>>> not-so-obvious code:
>>>
>>> julia> unique(filter(x->isa(x,Function) && isa(x.env,Symbol),
>>> map(s->Base.(s), filter(s->isdefined(Base,s), names(Base, true, true)))))
>>> 22-element Array{Any,1}:
>>> issubtype
>>> is
>>> _apply
>>> _expr
>>> applicable
>>> apply_type
>>> arrayref
>>> arrayset
>>> arraysize
>>> fieldtype
>>> getfield
>>> invoke
>>> isa
>>> isdefined
>>> kwcall
>>> nfields
>>> setfield!
>>> svec
>>> throw
>>> tuple
>>> typeassert
>>> typeof
>>>
>>>
>>> On Sun, Dec 27, 2015 at 2:57 PM, Ray Toal <[email protected]> wrote:
>>>
>>>> In the REPL
>>>>
>>>>
>>>> *julia> **methods(is)*
>>>>
>>>> *ERROR: ArgumentError: argument is not a generic function*
>>>>
>>>> * in methods at reflection.jl:180*
>>>>
>>>>
>>>> and ditto for isa and typeof and perhaps others.
>>>>
>>>> Two quick questions:
>>>>
>>>> - Is it possible for the programmer to create nongeneric functions
>>>> in Julia?
>>>> - If not, is there a complete (at least up to the current release
>>>> version of the language) list of nongeneric functions?
>>>>
>>>>
>>>>
>>>>
>>>