Perhaps, but all of this is going to change fairly soon. Why is this
information useful?

On Sun, Dec 27, 2015 at 4:03 PM, Ismael Venegas Castelló <
[email protected]> wrote:

> 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?
>>>>
>>>>
>>>>
>>>>
>>>

Reply via email to