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] <javascript:>
> > 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?
>>
>>
>>
>>
>