see my comment to https://github.com/jkaye2012/Redis.jl/issues/26
On Monday, March 21, 2016 at 11:40:38 AM UTC+2, Milan Bouchet-Valat wrote: > > Le dimanche 20 mars 2016 à 16:56 -0700, Jeffrey Sarnoff a écrit : > > Redis itself is written in C. They document GET key: > > > Get the value of key. If the key does not exist the special > > > value nil is returned. > > > > An error is returned if the value stored at key is not a string, > > because GET only handles string values. > > > > digging deeper > > > The client library API should not return an empty string, but a nil > > > object, when the server replies with a Null Bulk String. > > > > For example a Ruby library should return 'nil' while a C library > > should return NULL (or set a special flag in the reply object), and > > so forth. > > > Single elements of an Array may be Null. This is used in Redis > > > replies in order to signal that this elements are missing and not > > > empty strings. > > > > This can happen with the SORT command when used with the > > GET pattern option when the specified key is missing. > > > > [For example, if the] second element is a Null. The client library > > should return something like this: ["foo", nil, "bar"] > > The Redis nil indicates a non-present value (missing or unavailable > > or, not extant: a domain|-> range error). > > From a semiotic viewpoint, Julia's nothing is closer to "absence" > > than it is to "an absent value"; of course > > the operational machinery supplies an actual entity to be nothing (a > > singleton realization ofthe type Void). > > > > A much more contextual fit be the use of Nullable, although that may > > require more of the client; a simpler way > > to handle the Redis nil without doing something with nothing is to > > use a dedicated const symbol or a singleton > > to be that sentinel, perhaps: > > const RedisNil = :RedisNil # or > > type RedisNIL end; RedisNil = > > RedisNIL() > > > > Somewhere there are lengthy and informative discussions about Julia > > and nil / NULL / nothing. > > (I noted this thread to the Redis.jl project). > Interesting. Though this wouldn't be an actual sentinel, as a symbol is > a different type from a string, so type instability would remain. > > It seems that Redis.jl has chosen to follow the Python API, which isn't > type-stable. In Julia, it could make sense to retain a type-stable > solution, i.e. always return a Nullable. This would be a good test to > check what improvements Julia needs to make working with Nullable > pleasant enough. > > Actually, get() from Redis.jl is faced with the very same design issue > as get() from Julia Base. The latter raises an error when a key is > missing, and there's been discussions about offering an alternative > function which would return a Nullable: > https://github.com/JuliaLang/julia/issues/13055 > > I would argue that Redis.jl should follow the same pattern as Base for > consistency. It would be interesting to get comments from the package > author about this. > > > Regards > > > > > > > > > > > > > Redis.jl returns nothing when requesting a the value of a key that > > > doesn't exist: > > > > > > using Redis > > > conn = RedisConnection() > > > r = get(conn, "non_existent_key") > > > disconnect(conn) > > > r == nothing # true > > > > > > > > > > For now I don't know of a good solution to this pattern, but > > > > there's > > > > been some discussion about it: > > > > https://github.com/JuliaLang/julia/issues/15174 > > > > > > > > You should definitely use a Nullable instead of returning > > > > nothing. > > > > > > > > > > > > Regards > > > > > > > > Le samedi 19 mars 2016 à 02:58 -0700, Jeffrey Sarnoff a écrit : > > > > > You may be misusing nothing. It is unusual that a function > > > > would > > > > > return nothing some of the time and something other times. > > > > > Take a look at http://docs.julialang.org/en/latest/manual/faq/# > > > > nothin > > > > > gness-and-missing-values > > > > > If you have additional questions about this, please give an > > > > example > > > > > of what get_a(...) is getting and why it would be nothing some > > > > of the > > > > > time. > > > > > > > > > > > Hi All > > > > > > > > > > > > > > > > > > I found my self writing code like this a lot: > > > > > > > > > > > > x = get_a(...) > > > > > > > > > > > > if x != nothing > > > > > > y::A = x > > > > > > do_sth(y, ...) > > > > > > end > > > > > > > > > > > > In the above, I have to check for nothing first, and if it is > > > > not > > > > > > nothing, then I do a type assert to make sure the type is > > > > what I > > > > > > expected. > > > > > > > > > > > > Is there any function or macro in Julia that can help this? > > > > > > > > > > > > I know in F#, I have option.bind, so option.bind f x is > > > > equivalent > > > > > > to a pattern match: if x is None - > None; if x is something > > > > -> > > > > > > f(something) > > > > > > > > > > > > Also in C#, I have "customers?[0]?.Orders?.Count();" (as > > > > long as > > > > > > there is null before ?, it returns null immediately) > > > > > > > > > > > > Does Julia have something similar? > > > > > > > > > > > > >
