Your description of Javascript's || is reminiscent of Perl's implementation,
though Perl's is even more permissive (eg 'zero' is false). When I used Perl,
I definitely got a lot of use out if it, especially since it was shortcutted
(IIRC).
One idiom that particularly saw a lot of use in my code was:
$var ||= 'default value if $var not yet defined'
I sorely missed this idiom when I first transitioned to J, but left it behind
as I began to think more in J and less in Perl. [1]
Your investigations in this thread are interesting, and as you concluded mostly
hinge on how to define "undefined". The code will fall out of that easily.
Some notes:
+ I wouldn't name this "or", I would prefer something like "defaultTo" .
+ I would make it an adverb that takes a predicate (boolean valued verb)
parameter that indicates the "undefinedness" of its argument, and futhermore
provide a convenient example predicate along the lines you've been exploring.
+ I would avoid tricks along the lines of +/@:, etc. Let the user decide
what cells he wants to test for "definedness" (eg atoms, items, total array),
and let him use the normal J mechanisms to do this (ie rank). The definiton of
"undefined" can be domain-dependent (witness Perl's 'zero'), so permit that
flexibility (eg by making your convenience predicate infinite rank).
Incidentally, this saves you both more design decisions and coding work.
+ In designing my convenience predicate, I would bear in mind that unlike
Javascript and Perl, J has no explicit "undefined" marker, so this utility
would bear a different meaning in J. In fact, the only way to indicate
"undefined" argument in J is the complete absence of that argument. And even
that is only possible in very limited circumsrances, eg 'default'&$ :
dyadic_verb . Where else can you elide an argument and still have meaningful
execution occur?
+ On the topic of the convenience predicate, I would avoid any explicit
decisions based on type, and maintain J's egalitarian nature. For example, for
'is null', I might choose 0 = # or 0 e. $ . Let any necessary type
dependencies fall out naturally, as in 'zero'&-: (as opposed to isLiteral *.
'zero'&-: which is both redundant and brittle [it fails on unicode
arguments]) or maybe even (s:<'zero')-:s:@boxopen .
-Dan
[1] Though sometimes I still use a pattern like:
accumulator =. (accumulator"_ :: (initial_value"_) ) , new_item
to avoid having to explicitly initialize. accumulator. as a separate step.
Sent from my Verizon Wireless BlackBerry
-----Original Message-----
From: Tracy Harms <[email protected]>
Date: Wed, 21 Oct 2009 10:55:04
To: Programming forum<[email protected]>
Subject: Re: [Jprogramming] Noun type assessment
I just noticed that my move from
(= ])
to
(= +/)
did not generalize "entirely false" for arrays of any rank. I should have used
(= +/@:,)
And, as noted in my prior posting, we can't necessarily presume that
this (+/@:,) fits what will be needed for the expanded meaning of
"false". The expansion of meaning would have to be tamed by giving it
specific context, as a start.
T
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm